2013-05-11 15 views
5

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?

Antwort

6

Blick auf diesen Code:

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

Sie einen kleinen Tippfehler haben hier, sollte es sein glUniform1 * i * statt Uniform1 * f * in den zweiten Anruf. Der Typ muss mit dem der Shader-Variablen übereinstimmen, daher sollte dieser Aufruf nur zu einem Fehler führen, sodass die Uniform auf 0 initialisiert wird, was Ihre Ergebnisse vollständig erklärt.

+0

Vielen Dank! Es ist erstaunlich, wie etwas so klein solche Kopfschmerzen verursachen kann. – Freddy

+4

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

Verwandte Themen