无法在启用OpenGL深度测试的情况下绘制我的三角形

Xia*_*Jun 1 opengl graphics

我写了一个程序来绘制一个简单的三角形,我使用VAO,VBO和GLSL着色器.结果如下:

在此输入图像描述

但如果我使用以下方法启用深度测试

glEnable(GL_DEPTH_TEST)
Run Code Online (Sandbox Code Playgroud)

窗口中没有任何内容.

现在我发布一些我的程序代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么在启用深度测试后我无法绘制三角形?

Sio*_*vok 5

通常,渲染时使用多种(类型)缓冲区.一个是颜色缓冲区,其包含某些像素格式的像素数据(IE:RGB,每个颜色通道具有8位).使用的另一种典型缓冲区是深度缓冲区.深度测试和写入深度缓冲区是两回事.深度测试检查来自像素的深度值与深度缓冲器中的相关像素的深度值,并决定是接受还是拒绝像素/片段.深度写入实际上将该值写入缓冲区,例如深度缓冲区.

您的程序可能会写入深度缓冲区并测试深度缓冲区,但您永远不会清除深度缓冲区,因此它认为即使已清除了颜色缓冲区,也已经写入了处于/处的内容您尝试写入的像素的前面(或任何配置),因此拒绝它们.

通常,每帧清除深度缓冲区.你通过传递GL_DEPTH_BUFFER_BIT标志来做到这一点glClear.