2013-05-11 19 views
5

Podczas wysyłania dwóch tekstur do mojego modułu cieniującego GLSL pojawia się tylko jeden. Dziwne jest to, że pierwsza struktura, którą łączę, jest używana dla obu szczelin tekstur w moim cieniu. To prowadzi mnie do tego, że sposób w jaki przekazuję moje tekstury w OpenGL jest błędny. Jednak nie jestem w stanie wyśledzić problemu.Wysyłanie dwóch tekstur do modułu cieniującego GLSL

Oto kod, w którym konfiguruję tekstury do użycia w moim module cieniującym.

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo2); 
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


// Get uniforms 
GLuint pass_3O = glGetUniformLocation(blend_shader, "org"); 
GLuint pass_3B = glGetUniformLocation(blend_shader, "blur"); 

// Activate shaders 
glUseProgram(blend_shader); 


// Bind first texture 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, init_texture); 

// Bind the second texture 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, third_texture); 

// Assign index to 2d images 
glUniform1i(pass_3O, 0); 
glUniform1f(pass_3B, 1); 

Powyższy kod przechodzi w dwóch teksturach. Pierwszy to obraz 2D pierwszego przejścia renderowania sceny 3D. Trzeci to ta sama tekstura z dodanymi poziomami rozmycia x2. Ostatnim etapem jest połączenie ich ze sobą w celu uzyskania słabego kwitnienia mans.

Oto kod, w którym rysuję obie tekstury do kwadratu.

// Draw to quad 
glBegin(GL_QUADS); 
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 0.0f); 
    glVertex3f(-w_width/2.0, -w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 1.0f); 
    glVertex3f(-w_width/2.0, w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 1.0f); 
    glVertex3f(w_width/2.0, w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 0.0f); 
    glVertex3f(w_width/2.0, -w_height/2.0, 0.5f); 
glEnd(); 
glFlush(); 
glPopAttrib(); 

// Unbind textures 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, 0); 

// Disable blend shader 
glUseProgram(0); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); 

I tu jest moduł cieniujący, którego używam do renderowania ostatecznego obrazu.

Vert

#version 120 
void main() 
{ 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_TexCoord[1] = gl_MultiTexCoord1; 
    gl_Position = ftransform(); 
} 

Frag

#version 120 
uniform sampler2D org; 
uniform sampler2D blur; 
void main() 
{ 
    vec4 orig_clr = texture2D(org, gl_TexCoord[0].st); 
    vec4 blur_clr = texture2D(blur, gl_TexCoord[1].st); 
    //gl_FragColor = orig_clr; 
    gl_FragColor = blur_clr; 
} 

Gdybym przełączać się między dwóch ostatnich linii w cieniującego fragmentu uzyskać dokładnie taki sam wynik. Jedynym sposobem na zmianę renderowania tekstury jest zmiana kolejności, w której je łączę.

Na przykład: w końcu przekazałbym mi zamazany obraz. Jeszcze raz otrzymałem tylko jedno z dwóch obrazów.

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, third_texture); 


glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, init_texture); 

Jakieś myśli na temat tego, co przeoczyłem?

Odpowiedz

6

Spójrz na ten kod:

glUniform1i(pass_3O, 0); 
glUniform1f(pass_3B, 1); 

masz jakąś małą literówkę tutaj powinno być glUniform1 * i * zamiast Uniform1 * f * w drugim naborze. Typ musi pasować do zmiennej modułu cieniującego, więc to wywołanie powinno po prostu spowodować błąd, pozostawiając mundur zainicjowany na 0, co całkowicie wyjaśnia twoje wyniki.

+0

Dziękuję bardzo! To niesamowite, jak coś tak małego może powodować takie bóle głowy. – Freddy

+4

Alternatywnie możesz użyć nowego layoutu (binding = 0) dla pierwszej tekstury i layout (binding = 1) dla pierwszej tekstury, a następnie nie musisz ustawiać uniformów. Oczywiście do tego potrzebujesz OpenGL4.2 ... – fluffels

Powiązane problemy