关于启用深度测试


我现在利用OpenGL写了一个简单的程序,就是绘制一个三角形。其中我用到了VAO(vertex array object)、VBO(vertex buffer object)以及GLSL shader程序。
效果图如下:

请输入图片描述

但是我如果启用深度测试的话:
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];

//绑定VBO以供使用
glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
//加载数据到VBO
glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
positionData,GL_STATIC_DRAW);

//绑定VBO以供使用
glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
//加载数据到VBO
glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
colorData,GL_STATIC_DRAW);

glGenVertexArrays(1,&vaoHandle);
glBindVertexArray(vaoHandle);

glEnableVertexAttribArray(0);//顶点坐标
glEnableVertexAttribArray(1);//顶点颜色

//调用glVertexAttribPointer之前需要进行绑定操作
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();
}

图形学 opengl

mascot 12 years ago

终于找到了问题所在。为了正确启用深度测试,必须在绘制每一帧之前清空深度缓冲区。即:
glClear(GL_DEPTH_BUFFER_BIT);
否则深度测试无法正常进行。
原因是在绘制完第一帧之后,深度缓冲区中的值已经被改写了,对应物体像素的位置的深度值已经是物体对象的深度,因此在以后的帧绘制时,深度测试会导致无法绘制出物体对象。

人称触女收割机 answered 12 years ago

Your Answer