2013-05-11 3 views
5

Quando si inviano due trame sul mio shader GLSL ne arriva solo uno. La cosa strana è che la prima texture che leghiamo viene usata per entrambe le trame di textures nel mio shader. Questo mi porta a credere che il modo in cui sto passando le mie trame in OpenGL sia sbagliato. Tuttavia, non sono in grado di rintracciare il problema.Invio di due trame allo shader GLSL

Ecco il codice in cui configuro le trame da utilizzare nel mio shader.

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); 

Il codice sopra sta passando in due trame. La prima è un'immagine 2D del primo passaggio di rendering della scena 3D. Il terzo è la stessa texture con i livelli x2 di sfocatura aggiunti. Questo stadio finale è quello di fonderli insieme per una fioritura povera.

Ecco il codice in cui sto disegnando entrambe le trame sul quad.

// 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); 

E qui è lo shader che sto usando per rendere l'immagine finale.

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; 
} 

Se posso passare tra le ultime due righe nello shader frammento ottengo gli stessi risultati esatti. L'unico modo per cambiare quale texture ha il rendering è cambiare l'ordine in cui li lego.

Ad esempio, il seguente potrebbe finalmente passarmi l'immagine sfocata. Ancora una volta, ottenendo solo una delle due immagini.

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


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

Qualche idea su ciò che sto trascurando?

risposta

6

Guardate questo codice:

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

avete qualche piccolo errore di battitura qui, dovrebbe essere glUniform1 * i * invece di Uniform1 * F * in seconda convocazione. Il tipo deve corrispondere a quello della variabile shader, quindi questa chiamata dovrebbe comportare solo un errore, lasciando l'uniforme inizializzata a 0, che spiega completamente i risultati.

+0

Grazie mille! È incredibile come qualcosa di così piccolo possa causare mal di testa. – Freddy

+4

In alternativa, è possibile utilizzare il nuovo layout (associazione = 0) per la prima trama e layout (associazione = 1) per la seconda, quindi non è necessario impostare le uniformi. Certo, hai bisogno di OpenGL4.2 per questo ... – fluffels