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?
Dziękuję bardzo! To niesamowite, jak coś tak małego może powodować takie bóle głowy. – Freddy
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