2015-05-04 9 views
5

Mi piacerebbe disegnare una scena al framebuffer predefinito, mentre disegno alcuni dati ausiliari relativi ad alcuni dei miei modelli disegnati su un buffer fuori schermo con le stesse dimensioni dell'immagine del framebuffer predefinito.In OpenGL è possibile per un programma shader, in una chiamata di estrazione, eseguire il rendering sia su un FBO che sul framebuffer predefinito?

Capisco che posso fare queste due cose separatamente, in due chiamate glDraw * (un rendering a un FBO, uno non) che utilizzerà due programmi shader appropriati.

E credo che (ancora imparando su questo) che posso fare loro principalmente contemporaneamente, collegando due renderbuffers/texture per un FBO, effettuando una glDraw * chiamata con un programma shader di cui Shader frammento scriverà valori appropriati a più uscite corrispondenti ai molteplici allegati FBO, e infine copiare una delle due immagini nell'FBO sul framebuffer predefinito, usandolo per tessere un quadrante pieno di scene o chiamando glBlitFramebuffer.

Ma posso effettuare una chiamata a glDraw *, con un programma shader, e il mio frammento shader scrivere sia nel framebuffer visibile che nell'FBO fuori schermo? Non sospetto, da quello che ho visto della documentazione pertinente, ma non ne sono certo.

risposta

5

No, non è possibile disegnare contemporaneamente diversi framebuffer. Ma puoi disegnare su diversi buffer attirati da un framebuffer. Questo è possibile e chiamato più destinazioni di rendering.

È necessario specificare pareggio tamponi in questo modo:

GLenum DrawBuffers[] = 
{ 
    GL_COLOR_ATTACHMENT0, 
    GL_COLOR_ATTACHMENT1, 
    GL_COLOR_ATTACHMENT2, 
    GL_COLOR_ATTACHMENT3 
}; 
glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers); 

Poi, in uno shader frammento, devi scrivere qualcosa di simile:

layout (location = 0) out vec3 WorldPosOut; 
layout (location = 1) out vec3 DiffuseOut; 
layout (location = 2) out vec3 NormalOut; 
layout (location = 3) out vec3 TexCoordOut; 

uniform sampler2D gColorMap; 

void main() 
{ 
    WorldPosOut = WorldPos0; 
    DiffuseOut = texture(gColorMap, TexCoord0).xyz; 
    NormalOut = normalize(Normal0); 
    TexCoordOut = vec3(TexCoord0, 0.0); 
} 

valori di uscita questa volontà di tutti i buffer disegnare a una volta. Fare riferimento a http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html per un esempio completo.

Problemi correlati