Почему отключение записи в буфер глубины почти ничего не рисует? - PullRequest
12 голосов
/ 04 марта 2012

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

1 Ответ

21 голосов
/ 05 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...