OpenGL - Rendern in Framebuffer liefert weiße Textur



  • Hallo,

    ich will einen Würfel in OpenGL in einen Framebuffer rendern, und die resultierende "Textur" dann auf einem Quad darstellen. Das Rendern des Würfels funktioniert wenn er direkt auf dem Bildschirm dargestellt wird, aber wenn er in den Framebuffer gerendert wird und ich später darauf zugreife, bekomme ich nur ein weißes Bild.

    Meine Renderfunktion:

    void render()
    {
       // cull the front face and render it to the framebuffer
       glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
       glClearColor(1.0, 1.0, 1.0, 1.0);
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
       glCullFace(GL_FRONT);
       glUseProgram(bfprogram);
       glEnableVertexAttribArray(attribute_coord3d);
    
       glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_vertices);
       glVertexAttribPointer(
                attribute_coord3d, 
                3,                 
                GL_FLOAT,          
                GL_FALSE,          
                0,                 
                0                 
                );
    
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cube_elements);
       int size;  glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
       glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
    
       glDisableVertexAttribArray(attribute_coord3d);
    
       //render the quad which displays the framebuffer's contents
       glCullFace(GL_BACK);
       glBindFramebuffer(GL_FRAMEBUFFER, 0);
       glUseProgram(program);
       glBindBuffer(GL_ARRAY_BUFFER, vbo_quad_vertices);
       glEnableVertexAttribArray(attribute_coord2d);
    
       glBindBuffer(GL_ARRAY_BUFFER, vbo_quad_vertices);
       glVertexAttribPointer(
                attribute_coord2d, 
                2,                 
                GL_FLOAT,          
                GL_FALSE,          
                0,                 
                0                 
                );
    
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_quad_elements);
       glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
    
       glActiveTexture(GL_TEXTURE0);
       glBindTexture(GL_TEXTURE_2D, texColorBuffer);
    
       glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
       glDisableVertexAttribArray(attribute_coord2d);
    
       glutSwapBuffers();
    }
    

    Meine Shader für den Quad:
    Vertex:

    #version 330
    out vec2 fbcoord;
    in vec2 coord2d;
    
    void main(void) {
      gl_Position = vec4(coord2d.x, coord2d.y, 0.0, 1.0);
      fbcoord = coord2d;
    }
    

    Fragment:

    #version 330
    
    in vec2 fbcoord;
    uniform sampler2D texFramebuffer;
    out vec4 color;
    
    void main(void) {
       color = texture2D(texFramebuffer, fbcoord);
    }
    

    Und für den Würfel:
    Vertex:

    #version 330
    
    uniform mat4 mvp;
    out vec3 f_color;
    in vec3 coord3d;
    
    void main(void) {
      gl_Position = mvp * vec4(coord3d, 1.0);
      f_color = vec3(coord3d.x, coord3d.y, coord3d.z);
    }
    

    Fragment:

    #version 330
    
    in vec3 f_color;
    out vec4 color;
    
    void main(void) {
      color = vec4(f_color.x, f_color.y, f_color.z, 1.0);
    }
    

    Um den Beitrag nicht zu sprengen lass ich die Initialisierung vorerst mal weg, vielleicht ist der Fehler schon direkt in den Shadern bzw. in der Renderingfunktion ersichtlich. Ansonsten reiche ich den noch nach.



  • Problem gelöst.

    glDisable(GL_DEPTH_TEST);
    

    ist erforderlich wenn man das Quad rendert. Kann mir jemand erklären wieso das so ist? Ich render ja eigentlich direkt auf den Quad...


Anmelden zum Antworten