向我的GLSL着色器发送两个纹理时,只有一个实际到达.奇怪的是我绑定的第一个纹理用于我的着色器中的两个纹理槽.这让我相信我在OpenGL中传递纹理的方式是错误的.但是,我无法追查问题.
这是我配置纹理以在我的着色器中使用的代码.
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);
Run Code Online (Sandbox Code Playgroud)
上面的代码传递了两个纹理.第一个是3D场景的第一个渲染过程的2D图像.第三个是添加了x2级别模糊的相同纹理.最后阶段是将它们混合在一起,以实现可怜的芒.
这是我将两个纹理都绘制到四边形的代码.
// 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);
Run Code Online (Sandbox Code Playgroud)
这是我用来渲染最终图像的着色器.
韦尔
#version 120
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
如果我在片段着色器中的最后两行之间切换,我会得到完全相同的结果.更改渲染哪个纹理的唯一方法是更改绑定它们的顺序.
例如,以下将最终传递给我模糊的图像.再一次,只获得两个图像中的一个.
glActiveTexture(GL_TEXTURE0 );
glBindTexture(GL_TEXTURE_2D, third_texture);
glActiveTexture(GL_TEXTURE1 );
glBindTexture(GL_TEXTURE_2D, init_texture);
Run Code Online (Sandbox Code Playgroud)
对我所俯瞰的任何想法?
看看这段代码:
glUniform1i(pass_3O, 0);
glUniform1f(pass_3B, 1);
Run Code Online (Sandbox Code Playgroud)
你在这里有一些小错字,它应该是glUniform1*i*而不是第二次调用中的Uniform1*f*.该类型必须与着色器变量的类型匹配,因此此调用只会导致一些错误,将统一值初始化为0,这完全解释了您的结果.