相关疑难解决方法(0)

为什么禁止写入深度缓冲区几乎不会产生任何结果?

按照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)

opengl

12
推荐指数
1
解决办法
7680
查看次数

将透明纹理与深度混合

我试图混合具有透明区域的纹理:

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, ...);
glVertexPointer( 2, GL_FLOAT, 0, ... );
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );
Run Code Online (Sandbox Code Playgroud)

除非我添加glDisable(GL_DEPTH_TEST),否则顶部纹理的透明部分会覆盖它们下面的所有内容(而不是混合).有没有办法在不禁用深度的情况下做到这一点?我尝试了各种混合功能但没有帮助.

textures alphablending opengl-es

5
推荐指数
1
解决办法
2231
查看次数

标签 统计

alphablending ×1

opengl ×1

opengl-es ×1

textures ×1