2015-01-25 5 views
-4

вот мой код:почему мне нужно glClear (GL_DEPTH_BUFFER_BIT)

#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 и Mac OS X 10.1.2, пожалуйста, помогите мне с этим, благодаря

+4

Вы должны действительно _read_ комментариев в своем собственном коде. – derhass

ответ

0

// протирать рисунок поверхности ясно , glClear (GL_DEPTH_BUFFER_BIT);

Что означает этот комментарий над кодом, означает, что он очищает буфер глубины. Буфер глубины является частью буфера кадров, что препятствует объектам других объектов в их передней части. Без очистки буфера глубины вы должны врисовать структуру глубины предыдущего чертежа.

7

Буфер глубины используется для определения того, является ли геометрия, которую вы визуализируете, ближе к средству просмотра, чем геометрия, которую вы визуализировали ранее. Это позволяет устранить скрытую геометрию.

Этот тест выполняется для фрагмента (пикселя). Каждый раз, когда фрагмент визуализируется, его глубина сравнивается с соответствующим значением в буфере глубины. Если новая глубина больше, фрагмент удаляется с помощью теста глубины. В противном случае фрагмент записывается в цветовой буфер, а значение в буфере глубины обновляется глубиной нового фрагмента. Функциональность контролируется этими вызовами вы делаете во время установки:

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

Таким образом, если фрагмент покрыт множеством треугольников, цвета конечных точек будет определяться геометрией, которая была ближе к зрителю.

Теперь, если вы не очистите буфер глубины в начале каждого кадра, сравнение с значением в буфере глубины, описанным выше, будет использовать любое значение, находящееся в буфере глубины. Это может быть значение из предыдущего кадра или неинициализированное значение мусора. Таким образом, фрагменты могут быть устранены с помощью теста глубины, даже если фрагменты в текущем кадре не были оттянуты в том же положении раньше. В крайнем случае все фрагменты устраняются с помощью теста глубины, и вы ничего не видите.

Если вы не уверены, что вы сделаете что-то для всех пикселей в своем окне, вы также захотите очистить цветной буфер в начале кадра. Таким образом, ваш четкий звонок должен быть:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);