首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要glClear(GL_DEPTH_BUFFER_BIT)?

为什么我需要glClear(GL_DEPTH_BUFFER_BIT)?
EN

Stack Overflow用户
提问于 2015-01-25 13:39:29
回答 2查看 10.5K关注 0票数 0

这是我的代码:

代码语言:javascript
复制
#include <GL/glew.h> // include GLEW and new version of GL on Windows
#include <GLFW/glfw3.h> // GLFW helper library
#include <stdio.h>

int main () {
    // start GL context and O/S window using the GLFW helper library
    if (!glfwInit ()) {
        fprintf (stderr, "ERROR: could not start GLFW3\n");
        return 1;
    }

    // uncomment these lines if on Apple OS X
    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 4);
     glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 1);
     glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
     glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL);
    if (!window) {
        fprintf (stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return 1;
    }
    glfwMakeContextCurrent (window);

    // start GLEW extension handler
    glewExperimental = GL_TRUE;
    glewInit ();

    // get version info
    const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
    const GLubyte* version = glGetString (GL_VERSION); // version as a string
    printf ("Renderer: %s\n", renderer);
    printf ("OpenGL version supported %s\n", version);

    // tell GL to only draw onto a pixel if the shape is closer to the viewer
    glEnable (GL_DEPTH_TEST); // enable depth-testing
    glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"

    /* OTHER STUFF GOES HERE NEXT */

    float points[] = {
        0.0f,  0.5f,  0.0f,
        0.5f, -0.5f,  0.0f,
        -0.5f, -0.5f,  0.0f
    };
    GLuint vbo = 0;
    glGenBuffers (1, &vbo);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW);
    GLuint vao = 0;
    glGenVertexArrays (1, &vao);
    glBindVertexArray (vao);
    glEnableVertexAttribArray (0);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    const char* vertex_shader =
    "#version 410\n"
    "layout(location = 0) in vec4 vPosition;"
    "void main () {"
    "  gl_Position = vPosition;"
    "}";
    const char* fragment_shader =
    "#version 410\n"
    "out vec4 frag_colour;"
    "void main () {"
    "  frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
    "}";
    GLuint vs = glCreateShader (GL_VERTEX_SHADER);
    glShaderSource (vs, 1, &vertex_shader, NULL);
    glCompileShader (vs);
    GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fs, 1, &fragment_shader, NULL);
    glCompileShader (fs);
    GLuint shader_programme = glCreateProgram ();
    glAttachShader (shader_programme, fs);
    glAttachShader (shader_programme, vs);
    glLinkProgram (shader_programme);
    while (!glfwWindowShouldClose (window)) {
        // wipe the drawing surface clear
        glClear (GL_DEPTH_BUFFER_BIT);
        const GLfloat color[]={0.0,0.2,0.0,1.0};
        //glClearBufferfv(GL_COLOR,0,color);
        glUseProgram (shader_programme);
        glBindVertexArray (vao);
        // draw points 0-3 from the currently bound VAO with current in-use shader
        glDrawArrays (GL_TRIANGLES, 0, 3);
        // update other events like input handling
        glfwPollEvents ();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers (window);
    }    // close GL context and any other GLFW resources
    glfwTerminate();
    return 0;
}

当我评论行glClear(GL_DEPTH_BUFFER_BIT)时,显示的窗口没有显示任何内容,这个例程重要吗?我正在使用Xcode和MacOSX10.1.2,请帮助我,谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-01-25 17:33:50

深度缓冲区用于判断渲染的几何图形是否比以前呈现的几何图形更接近查看器。这允许消除隐藏的几何图形。

这个测试是每个片段(像素)执行的。每当呈现片段时,都会将其深度与深度缓冲区中的相应值进行比较。如果新的深度较大,则通过深度试验消除碎片。否则,片段将写入颜色缓冲区,深度缓冲区中的值将随新片段的深度更新。该功能由您在安装过程中进行的以下调用控制:

代码语言:javascript
复制
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

这样,如果一个片段被多个三角形覆盖,最后一个像素的颜色将由离观看者最近的几何图形给出。

现在,如果没有在每个帧的开头清除深度缓冲区,则与上面描述的深度缓冲区中的值的比较将使用深度缓冲区中的任何值。这可以是来自上一帧的值,也可以是未初始化的垃圾值。因此,即使在当前帧中没有任何碎片在相同的位置上绘制,也可以通过深度测试消除碎片。在极端的情况下,所有的碎片都被深度测试排除了,你什么也看不到。

除非您确信会向窗口中的所有像素呈现某物,否则您还需要在框架开始时清除颜色缓冲区。所以你的明确要求应该是:

代码语言:javascript
复制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
票数 13
EN

Stack Overflow用户

发布于 2015-01-25 16:54:37

//清除绘图表面,glClear (GL_DEPTH_BUFFER_BIT);

这个注释的意思是代码上面的意思是清除深度缓冲区。深度缓冲区是帧缓冲区的一部分,它使对象被前面的其他对象所阻塞。在不清除深度缓冲区的情况下,您将绘制上一张绘图的深度结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28137027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档