Wenn ich zwei Texturen an meinen GLSL Shader sende kommt nur einer an. Was seltsam ist, ist die erste Textur, die ich für beide Texturen-Slots in meinem Shader verwende. Das lässt mich glauben, dass die Art und Weise, wie ich meine Texturen in OpenGL übergebe, falsch ist. Ich kann das Problem jedoch nicht aufspüren.Senden von zwei Texturen an GLSL Shader
Hier ist der Code, wo ich die Texturen für die Verwendung in meinem Shader konfigurieren.
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);
Der obige Code wird in zwei Texturen übergeben. Der erste ist ein 2D-Bild des ersten Rendering-Durchlaufs der 3D-Szene. Die dritte ist die gleiche Textur mit x2 Ebenen der Unschärfe hinzugefügt. Diese letzte Phase ist, sie für eine arme Mannblüte zusammen zu mischen.
Hier ist der Code, wo ich beide Texturen auf den Quad zeichnen.
// 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);
Und hier ist der Shader, den ich verwende, um das endgültige Bild zu rendern.
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;
}
Wenn ich zwischen den letzten beiden Zeilen in den Fragment-Shader wechseln bekomme ich die gleichen genauen Ergebnisse. Die einzige Möglichkeit zu ändern, welche Textur gerendert wird, besteht darin, die Reihenfolge zu ändern, in der ich sie bilde.
Zum Beispiel würde das folgende schließlich mir das unscharfe Bild übergeben. Noch einmal, nur eines der beiden Bilder.
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, third_texture);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, init_texture);
Irgendwelche Gedanken zu dem, was ich übersehe?
Vielen Dank! Es ist erstaunlich, wie etwas so klein solche Kopfschmerzen verursachen kann. – Freddy
Alternativ können Sie das neue Layout (Bindung = 0) für die erste Textur und Layout (Bindung = 1) für die zweite verwenden, dann müssen Sie die Uniformen nicht festlegen. Natürlich brauchen Sie dafür OpenGL4.2 ... – fluffels