2011-09-09 10 views
5

Jestem trochę zmieszany odnośnie framebufferów. Chcę użyć bufora ramki z dołączonymi wieloma teksturami, wypełnić każdą teksturę, a następnie użyć modułu cieniującego, aby połączyć (zmiksować) wszystkie tekstury, aby utworzyć nowe wyjście. Brzmi łatwo? tak, tak też myślałem, ale nie rozumiem tego.framebuffer i używanie shaderów w opengl

Jak przekazać aktualnie powiązaną teksturę do modułu cieniującego?

Odpowiedz

8

Potrzebne jest umieszczenie tekstury w określonym gnieździe, a następnie skorzystanie z samplera do odczytania z niego. W swojej aplikacji:

GLuint frameBuffer; 
glGenFramebuffersEXT(1, &frameBuffer); //Create a frame buffer 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer); //Bind it so we draw to it 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, yourTexture, 0); //Attach yourTexture so drawing goes into it 

//Draw here and it'll go into yourTexture. 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //Unbind the framebuffer so that you can draw normally again 

//Here we put the texture in slot 1. 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, yourTexture); 
glActiveTexture(GL_TEXTURE0); //Don't forget to go back to GL_TEXTURE0 if you're going to do more drawing later 

//Now we tell your shader where to look. 
GLint var = glGetUniformLocationARB(yourShaderProgram, "yourSampler"); 
glUniform1i(var, 1); //We use 1 here because we used GL_TEXTURE1 to bind our texture 

A w swojej fragment shader:

uniform sampler2D yourSampler; 

void main() 
{ 
    gl_FragColor = texture2D(yourSampler, whateverCoordinatesYouWant); 
} 

Można to wykorzystać z GL_TEXTURE2 i tak dalej, aby uzyskać dostęp nawet więcej tekstur w cieniującego.

+0

i dalej musiałbym wybrać drawbuffer, prawda? mając coś takiego: glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); \t glActiveTexture (GL_TEXTURE1); \t glBindTexture (GL_TEXTURE_2D, yourTexture); // draw GLint var = glGetUniformLocationARB (yourShaderProgram, "yourSampler"); glUniform1i (var, 1); // Używamy tutaj 1, ponieważ użyliśmy GL_TEXTURE1 do wiązania naszej tekstury – Donny

+3

@Donny Mieszamy dwie zupełnie różne rzeczy (czyli renderowanie do framebuffera i czytanie z wcześniej renderowanej tekstury). –

+0

Co próbuję zrobić, to renderowanie do bufora ramki, weź ten wynik w moduł cieniujący. Chodzi o to, że mogę mieć wiele różnych tekstur generowanych przez renderowanie do framebuffera. W rezultacie chcę wymieszać wszystkie te tekstury. Czy to możliwe? – Donny