glDepthMask 似乎没有按预期工作?
glDepthMask seems did not work as expected?
我渲染了两个三角形:一个是较小的红色三角形,深度值为负(顶点的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
};
//测试1
在渲染三角形之前,我启用深度测试,然后绘制较小的三角形,最后绘制较大的三角形。渲染结果是我所期望的。
//测试2
在渲染三角形之前,我禁用深度测试但启用更新深度缓冲区 (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);
我的代码有问题吗?
当禁用深度测试时,深度缓冲区根本不会被写入。
如果你想写深度缓冲区并且每个片段都应该通过深度测试,那么你必须启用深度测试,但是你必须将深度函数更改为GL_ALWAYS
,默认情况下深度函数是GL_LESS
.
不需要更改深度掩码,因为默认情况下启用了深度掩码。
参见 glDepthFunc
, glDepthMask
and Depth Test
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE); // superfluous
glDepthFunc(GL_ALWAYS);
// [...]
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
我渲染了两个三角形:一个是较小的红色三角形,深度值为负(顶点的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
};
//测试1
在渲染三角形之前,我启用深度测试,然后绘制较小的三角形,最后绘制较大的三角形。渲染结果是我所期望的。
//测试2
在渲染三角形之前,我禁用深度测试但启用更新深度缓冲区 (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);
我的代码有问题吗?
当禁用深度测试时,深度缓冲区根本不会被写入。
如果你想写深度缓冲区并且每个片段都应该通过深度测试,那么你必须启用深度测试,但是你必须将深度函数更改为GL_ALWAYS
,默认情况下深度函数是GL_LESS
.
不需要更改深度掩码,因为默认情况下启用了深度掩码。
参见 glDepthFunc
, glDepthMask
and Depth Test
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE); // superfluous
glDepthFunc(GL_ALWAYS);
// [...]
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);