图形学-关于启用深度测试

图形学-关于启用深度测试

清晨说ぺ晚安 发布于 2017-06-25 字数 2100 浏览 1158 回复 1

我现在利用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();
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛泛之交 2017-09-27 1 楼

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