2015-05-04 8 views
5

Ich möchte eine Szene auf den Standard-Framebuffer zeichnen, während ich auch einige Hilfsdaten zu einigen meiner gezeichneten Modelle in einen Offscreen-Puffer mit denselben Bilddimensionen wie der Standard-Framebuffer zeichne.In OpenGL ist es möglich für ein Shader-Programm, in einem Draw-Aufruf, sowohl zu einem FBO und dem Standard-Framebuffer zu rendern?

Ich verstehe, dass ich diese zwei Dinge separat machen kann, in zwei glDraw * -Anrufe (ein Rendering zu einem FBO, eine nicht), die zwei geeignete Shader-Programme verwenden.

Und ich denke, (noch darüber zu lernen) Ich kann sie tun meist gleichzeitig durch Anbringen von zwei renderbuffers/Texturen zu einem FBO, ein glDraw * mit einem Shader-Programm Shader dessen Fragment tun nennen auf die entsprechenden Werte schreiben mehrere Ausgaben, die den mehreren FBO-Anhängen entsprechen, und schließlich Kopieren eines der beiden Bilder im FBO zum Standard-Framebuffer, indem Sie es zum Strukturieren eines Quadrats zum Auffüllen von Szenen oder durch Aufrufen von glBlitFramebuffer verwenden.

Aber kann ich einen glDraw * Aufruf mit einem Shader-Programm machen, und meinen Fragment-Shader schreibe sowohl in den sichtbaren Framebuffer als auch in einen Offscreen FBO? Ich vermute, nicht, was ich von der relevanten Dokumentation gesehen habe, aber ich bin mir nicht sicher.

Antwort

5

Nein, Sie können nicht gleichzeitig auf verschiedene Framebuffer zeichnen. Sie können jedoch auf verschiedene Zeichenpuffer zeichnen, die einem Framebuffer zugeordnet sind. Dies ist möglich und mehrere Renderziele aufgerufen.

Sie müssen Unentschieden angeben puffert diese Weise:

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

Dann wird in einem Fragment-Shader, Sie haben wie etwas zu schreiben:

alle Puffer zeichnen
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); 
} 

Dies wird Ausgangswerte an Einmal. Ein vollständiges Beispiel finden Sie unter http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html.

Verwandte Themen