Подтвердить что ты не робот

Почему отключение записи в буфер глубины вызывает почти ничего, что нужно сделать?

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

Ответ 1

Можете ли вы повторно использовать glDepthMask перед вызовом glClear() или в конце цикла визуализации?

Предотвращение записи в буфер глубины предотвратит его правильную очистку.

http://www.opengl.org/wiki/FAQ#Masking