2015-05-04 9 views
5

Chciałbym narysować scenę do domyślnego bufora ramki, a także rysować niektóre dane pomocnicze związane z niektórymi z moich rysowanych modeli z buforem poza ekranem o takich samych rozmiarach obrazu jak domyślny bufor ramki.W OpenGL jest możliwe, aby jeden program cieniowania, w jednym wywołaniu losowania, renderował zarówno do FBO, jak i domyślnego bufora ramki?

Rozumiem, że mogę zrobić te dwie rzeczy osobno, w dwóch połączeniach glDraw * (jeden rendering do FBO, jeden nie), który użyje dwóch odpowiednich programów shaderów.

I myślę (w trakcie nauki na ten temat) Mogę zrobić je głównie jednocześnie, poprzez dołączenie dwóch renderbuffers/tekstur do jednego FBO, robiąc jeden glDraw * zadzwonić z jednego programu shader którego fragment shader zapisze odpowiednie wartości do wielu wyjścia odpowiadające wielokrotnym załącznikom FBO, a na koniec kopiowanie jednego z dwóch obrazów z FBO do domyślnego bufora ramki, poprzez użycie go do tekstury wypełniającego scenę kwadratu lub wywołanie funkcji glBlitFramebuffer.

Ale czy mogę wykonać jedno wywołanie glDraw * za pomocą jednego programu cieniującego i czy mój shader fragmentów zapisuje zarówno do widocznego framebuffera, jak i jakiegoś offscreenowego FBO? Podejrzewam, że nie, z tego, co widziałem w odpowiedniej dokumentacji, ale nie jestem pewien.

Odpowiedz

5

Nie, nie można narysować do różnych buforów ramek w tym samym czasie. Ale możesz narysować na różne bufory losowania, które zostały dodane do bufora ramki. Jest to możliwe i nazywa się wieloma celami renderowania.

musisz określić remisu buforuje ten sposób:

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

Następnie w cieniującego fragmentu, trzeba napisać coś takiego:

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); 
} 

wartości wyjściowych będzie to wszystkim zwrócić bufory na pewnego razu. Kompletny przykład można znaleźć w http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html.

Powiązane problemy