按照SigTerm的建议,我首先渲染所有不透明的多边形,然后glDepthMask(GL_FALSE)在渲染半透明多边形之前禁用深度缓冲区().
一旦我禁用深度缓冲区,它就会停止向屏幕绘制任何内容.当我移动相机时,我只能看到世界的一瞥(只有一小部分出现一秒钟,然后当我停止移动时消失).
如果我一直保持启用深度缓冲区,一切都很好,它就不像我想的那样好(半透明物体遮挡其他半透明物体).
如何让它正确渲染?
我的主渲染循环如下所示:
protected void RenderTerrain()
{
GL.Enable(EnableCap.DepthTest);
GL.Enable(EnableCap.CullFace);
_bfShader.Use();
_bfProjUniform.Mat4(_viewMat * _bfProjMat);
_bfTex.Bind();
GL.DepthMask(true);
GL.Disable(EnableCap.Blend);
_blendUniform.Set1(false);
_bfVao.Bind();
GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, SharedData.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _bfInstBuf.Length, 0);
GL.DepthMask(false);
GL.Enable(EnableCap.Blend);
_blendUniform.Set1(true);
_transVao.Bind();
GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, SharedData.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _bfTransBuf.Length, 0);
}
Run Code Online (Sandbox Code Playgroud)
渲染循环的另一半:
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
lock(_renderQueue)
{
while(_renderQueue.Count > 0)
{
_renderQueue.Dequeue().Invoke();
}
}
RenderTerrain();
RenderHUD();
SwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*Tim 21
你可以在调用glClear()之前或者在渲染循环结束时重新启用glDepthMask吗?
防止写入深度缓冲区将阻止其被正确清除.
http://www.opengl.org/wiki/FAQ#Masking