Следуя предложению 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();
}