Следуя предложению 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);
}
Другая половина цикла рендеринга:
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
lock(_renderQueue)
{
while(_renderQueue.Count > 0)
{
_renderQueue.Dequeue().Invoke();
}
}
RenderTerrain();
RenderHUD();
SwapBuffers();
}