glDepthMask似乎没有按预期工作?

问题描述 投票:1回答:1

我渲染两个三角形:一个是较小的红色三角形,具有负深度值(顶点的z坐标),另一个是具有正深度值的较大三角形。

float smallVertices[] = {
        //position          color
       -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f,// left
        0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f,// right
        0.0f,  0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f// top
    };

float bigVertices[] = {
        //position          color
        -1.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f,// left
         1.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f,// right
         0.0f,  1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f// top
    };

// TEST1 在渲染三角形之前,我启用深度测试,然后绘制较小的三角形,最后绘制更大的三角形。渲染结果是我的预期。

// TEST2 在渲染三角形之前,我禁用深度测试但启用更新深度缓冲区(glDepthMask(GL_TRUE))。然后我首先绘制较小的三角形,然后启用深度测试并将深度比较功能设置为GL_LESS,最后绘制更大的三角形。

我希望在一个更大的蓝色三角形里面有一个红色的小三角形。但是,渲染结果只是一个更大的蓝色三角形。

我设置glDepthMask(GL_TRUE)以使深度缓冲区的值更新为较小的三角形的深度值。然后使用较大的三角形的深度值与深度缓冲区的值进行比较。通过这种方式,我想我可以在一个更大的蓝色三角形内看到一个红色的小三角形。

// render
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(shaderProgram);

glDisable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

// draw our first triangle with negative depth value
glBindVertexArray(smallTriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

// draw the other triangle with positive depth value
glBindVertexArray(bigTriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);

我的代码有问题吗?

opengl-es depth-testing
1个回答
1
投票

禁用深度测试时,根本不会写入深度缓冲区。 如果要编写深度缓冲区并且每个片段都应该通过深度测试,那么您必须启用深度测试,但是您必须将深度函数更改为GL_ALWAYS,默认情况下深度函数为GL_LESS。 无需更改深度掩码,因为默认情况下启用深度掩码。见glDepthFuncglDepthMaskDepth Test

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE); // superfluous
glDepthFunc(GL_ALWAYS);

// [...]

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
© www.soinside.com 2019 - 2024. All rights reserved.