2016-12-13 4 views
-1

Ich versuche, die Tiefe einer Szene zu einer Cubemap-Textur zu rendern, aber wenn ich den Framebuffer-Status überprüfe, gibt es GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT zurück und natürlich erfolgt kein Rendering. Offensichtlich vermisse ich etwas, aber ich kann mir das nicht vorstellen, ich hatte gehofft, dass mir jemand hier helfen könnte. Meine Grafikkarte ist eine NVIDIA GeForce 840M, die OpenGL 4.5 unterstützt. Unten ist, wie ich das Rendering auf die FBO eingerichtet habe.Warum bekomme ich unvollständige Anhänge, wenn ich opengl fbo zum Rendern auf Cubemap-Tiefenstruktur einstelle?

UPDATE: Bringen Sie alle cubefacetextures vor Schleife Rendering

GLuint texhandle; 
glGenTextures(1, &texhandle); 
glBindTexture(GL_TEXTURE_CUBE_MAP, texhandle); 
for (int i = 0; i < 6; i++) { 
    glTexImage2D(
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 
     GL_DEPTH_COMPONENT24, 1600, 900, 
     0, GL_DEPTH_COMPONENT, GL_FLOAT, 0 
    ); 
} 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

GLuint fbohandle; 
glGenFramebuffers(num, &fbohandle); 
glBindFramebuffer(GL_FRAMEBUFFER, fbohandle); 
glCullFace(GL_BACK); 

for (int i = 0; i < 6; i++) { 
    glFramebufferTexture2D(
     GL_FRAMEBUFFER, 
     GL_DEPTH_ATTACHMENT, 
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,  
     fbohandle, 
     0 
    ); 
} 

for (int i = 0; i < 6; i++) { 
    GLenum cubemapSide = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, cubemapSide, fbohandle, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawBuffer(GL_NONE); 
    CheckFramebufferStatus(); 
    RenderScene() 
} 
+0

Sollten Sie nicht alles außer 'glFramebufferTexture2D' außerhalb der Schleife tun? Wenn Sie gerade das erste Gesicht angebracht haben, ist es nicht verwunderlich, dass der Framebuffer unvollständig ist. – BDL

+0

Richtig, macht Sinn, aber verwende ich nicht glFramebufferTexture2D, um anzugeben, welches Gesicht ich rendere? Wie auch immer, ich habe eine Schleife hinzugefügt, um Flächen vor der Rendering-Schleife anzuhängen, bekomme aber trotzdem den gleichen Fehler. – crimsoncheesecake

+0

glDrawBuffer (GL_NONE); macht keinen Sinn ... – starmole

Antwort

0

Lassen Sie uns die einfachen Fehler behandeln zuerst:

glFramebufferTexture2D(..., fbohandle, ...); 

Das ist falsch, sollten Sie natürlich texhandle verwenden, um die spezifische Textur Objekt zu befestigen (zu der derzeit gebundenen GL_FRAMEBUFFER, die zu dieser Zeit fbohandle sein wird).

Sie scheinen jedoch falsche Vorstellungen darüber zu haben, wie vielschichtige Framebuffer funktionieren. Es gibt nur eineGL_DEPTH_ATTACHMENT pro FBO, daher können Sie nur eine Sache Texturobjekt (oder Render-Puffer) daran anhängen.

Was Ihr Code konzeptionell tun würde (nachdem der Fehler oben behoben wurde), bindet jede Fläche der Cube-Map als einzelne ungeschichtete Tiefenanfügung, also nach der Schleife die letzte Cube-Fläche und die Schleife selbst an ist völlig sinnlos.

Schicht Rendering verwenden zu können, müssen Sie

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0); 

die im Falle eines Cubemap eine Tiefe Attachments mit 6 Schichten was sich auf die Seiten des Würfels Karte erstellen wird, und insbesondere auf die mimap Ebene 0 von all diesen.

Verwandte Themen