我编写了一个程序来绘制一个简单的三角形,我使用VAO,VBO和GLSL着色器。结果如下:
但如果我使用以下方式启用深度测试:
glEnable(GL_DEPTH_TEST)
窗口中没有任何内容。
现在我发布一些程序代码:
float positionData[] = {
-0.8f, -0.8f, 0.0f,
0.8f, -0.8f, 0.0f,
0.0f, 0.8f, 0.0f };
float colorData[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f };
void initVBO()
{
// Create and populate the buffer objects
GLuint vboHandles[2];
glGenBuffers(2, vboHandles);
GLuint positionBufferHandle = vboHandles[0];
GLuint colorBufferHandle = vboHandles[1];
glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
positionData,GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
colorData,GL_STATIC_DRAW);
glGenVertexArrays(1,&vaoHandle);
glBindVertexArray(vaoHandle);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL );
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL );
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vaoHandle);
glDrawArrays(GL_TRIANGLES,0,3);
glBindVertexArray(0);
glutSwapBuffers();
}
我的问题是:为什么在启用深度测试后我无法绘制三角形?
答案 0 :(得分:5)
通常,渲染时使用多种(类型)缓冲区。一个是颜色缓冲区,其包含某些像素格式的像素数据(IE:RGB,每个颜色通道具有8位)。使用的另一种典型缓冲区是深度缓冲区。深度测试和写入深度缓冲区是两回事。深度测试检查来自像素的深度值与深度缓冲器中的相关像素的深度值,并决定是接受还是拒绝像素/片段。深度写入实际上将该值写入缓冲区,例如深度缓冲区。
您的程序可能会写入深度缓冲区并测试深度缓冲区,但您永远不会清除深度缓冲区,因此它认为即使已清除了颜色缓冲区,也已经写入了它的内容。在您尝试写入的像素的前面(或任何配置),所以它拒绝它们。
通常每帧清除深度缓冲区。您可以将GL_DEPTH_BUFFER_BIT
标记传递给glClear
。
答案 1 :(得分:3)
您还需要明确清除深度缓冲区:
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT)