我正在Stage3D制作一个3D太空游戏,希望在所有其他物体后面绘制一个星空。我认为我遇到的问题是所涉及的距离非常高。如果我的恒星真的比其他物体远得多,我必须将它们缩放到无法正确渲染的程度——超过一定大小,脸似乎会闪烁。这种情况也发生在我的行星网格上,当缩放到必要的大小(12000到100000个单位)时。我在平面纹理上渲染星星,指向相机。只要它们没有放大太多,它们就会渲染得很好,尽管显然是在更远的其他对象前面。我已经尝试了所有方式的depthTestMode(Context3DCompareMode.LESS、Context3DCompare Mode.GGREATER和所有其他),并将其与包含和排除z缓冲区中的网格相结合,以便只有在恒星出现的地方不存在其他像素的情况下才能渲染恒星,但运气不好。有人知道我是如何做到这一点的吗?或者,更好的是,知道为什么超过一定大小的网格不能正确渲染吗?是否存在我不知道的任意上限?
我不知道Stage3D,我在这里用OpenGL语言说话,但绘制背景/skybox的常用方法是近距离绘制背景,不远,先绘制背景,并且在绘制背景时禁用深度缓冲写入(如果它本身不需要深度缓冲),或者在绘制背景之后和常规场景之前清除深度缓冲。
你的行星闪烁可能是由于缺乏深度缓冲分辨率;如果是这样,您必须在之间进行选择
- 绘制更靠近相机的对象
- 将摄影机平截头体近平面移得更远或远平面
- 以互斥的深度范围多次渲染场景(这称为深度剥离)
您应该使用starling。它可以工作
http://www.adobe.com/devnet/flashplayer/articles/away3d-starling-interoperation.htmlhttp://www.flare3d.com/blog/2012/07/24/flare3d-2-5-starling-integration/
您必须了解投影和顶点着色器输出是如何完成的。顶点着色器输出有四个组件:x、y、z、w。由此计算像素坐标:
x'=x/w
y'=y/w
z'=z/w
z’是最终在z缓冲区中的值。因此,只需将z=w*值放在顶点着色器的末尾,就可以输出任何常数值。只要输入值=.999,就可以了!你的常规无深度测试会起作用。