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?
Grazie mille! È incredibile come qualcosa di così piccolo possa causare mal di testa. – Freddy
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