2012-03-28 11 views
9

Ho frame buffer, con componente di profondità e 4 allegati colori con 4 textureOpenGL, come utilizzare depthbuffer da framebuffer come buffer solito profondità

traggo alcune cose in esso e UNBIND il buffer dopo, utilizzando 4 texture per framment shader (illuminazione differita). In seguito voglio disegnare qualche altra cosa sullo schermo, usando il depth buffer dal mio framebuffer, è possibile?

Ho provato a legare nuovamente il framebuffer e specificare glDrawBuffer (GL_FRONT), ma non funziona.

risposta

10

Come già detto Nicol, non è possibile utilizzare direttamente un buffer di profondità FBO come buffer di profondità del framebuffer predefinito.

Ma è possibile copiare buffer di profondità del FBO verso il framebuffer predefinito utilizzando il EXT_framebuffer_blit estensione (che dovrebbe essere di base dal GL 3):

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, 
        GL_DEPTH_BUFFER_BIT, GL_NEAREST); 

Se questa estensione non è supportato (che dubito quando hai già degli FBO), puoi usare una texture di profondità per l'allegato di profondità dell'FBO e renderlo al framebuffer predefinito usando un quad strutturato e un semplice pass through framment shader che scrive in gl_FragDepth. Anche se questo potrebbe essere più lento del semplice doppiaggio.

+0

yah, la funzione Blit funziona bene, grazie – ShPavel

2

Non è possibile allegare immagini (colore o profondità) al framebuffer predefinito. Allo stesso modo, non puoi prendere immagini dal framebuffer predefinito e collegarle a un FBO.

7

Ho appena sperimentato che copiare un buffer di profondità da un buffer di rendering al buffer di profondità principale (contestualmente fornito) è altamente inaffidabile quando si usa glBlitFramebuffer. Solo perché non puoi garantire che il formato corrisponda. L'utilizzo di GL_DEPTH_COMPONENT24 come il mio formato di texture di profondità interno non funzionava sul mio AMD Radeon 6950 (ultimo driver) perché Windows (o il driver) ha deciso di usare l'equivalente a GL_DEPTH24_STENCIL8 come formato di profondità per il mio front/backbuffer, sebbene Non ho richiesto alcuna precisione di stencil (i bit di stencil impostati su 0 nel descrittore di formato pixel). Quando si utilizza GL_DEPTH24_STENCIL8 per la texture della profondità del mio framebuffer, il Blitting ha funzionato come previsto, ma ho avuto altri problemi con questo formato. Il primo tentativo ha funzionato bene con le schede NVIDIA, quindi sono abbastanza sicuro di non aver combinato problemi.

ciò che funziona meglio (nella mia esperienza) è la copia tramite Shader:

il frammento-Program (aka Pixel-Shader) [GLSL]

#version 150 

uniform sampler2D depthTexture; 
in vec2 texCoords; //texture coordinates from vertex-shader 

void main(void) 
{ 
    gl_FragDepth = texture(depthTexture, texCoords).r; 
} 

Il codice C++ per la copia simile a questa:

glDepthMask(GL_TRUE); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glEnable(GL_DEPTH_TEST); //has to be enabled for some reason 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
depthCopyShader->Enable(); 
DrawFullscreenQuad(depthTextureIndex); 

so che il filo è vecchio, ma è stato uno dei miei primi risultati quando googeling il mio problema, quindi voglio tenerlo più coerente possibile.

+0

Grazie, risolto il problema con la mia grafica Intel integrata. – joesmoe891

+1

C'è un modo per ottenere il formato buffer predefinito dopo la sua creazione e usarlo per creare il fbo? –

+0

Mi chiedo anche la stessa cosa di @LukeB. in quanto consentirebbe il blitting tra due framebuffers sapendo che i formati corrispondono. Ciò funzionerebbe anche nel caso in cui vogliamo sfruttare il framebuffer predefinito che non possiamo fare con uno shader, dal momento che il suo depth buffer non è accessibile. –

Problemi correlati