2013-05-11 108 views
5

向我的GLSL着色器發送兩個紋理時,實際只有一個紋理到達。奇怪的是,我綁定的第一個紋理用於​​着色器中的兩個紋理槽。這使我相信我在OpenGL中傳遞紋理的方式是錯誤的。但是,我無法追查這個問題。向GLSL着色器發送兩個紋理

這裏是我配置我的着色器中使用的紋理的代碼。

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

上面的代碼傳入兩個紋理。第一個是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); 

這裏是我用來渲染最終圖像的着色器。

韋爾

#version 120 
void main() 
{ 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_TexCoord[1] = gl_MultiTexCoord1; 
    gl_Position = ftransform(); 
} 

破片

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

如果我在片段着色器的最後兩行之間進行切換,我得到完全相同的結果。更改渲染紋理的唯一方法是更改​​綁定它們的順序。

例如,下面最終會傳遞給我模糊的圖像。再一次,只有兩個圖像中的一個。

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


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

對我所忽略的內容有何想法?

回答

6

看看這段代碼:

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

你有一些小錯字這裏,應該是glUniform1 * I *而不是在第二次調用Uniform1 * F *。該類型必須與着色器變量相匹配,所以這個調用只會導致一些錯誤,使統一初始化爲0,這完全解釋了你的結果。

+0

非常感謝!它驚人的如此小的事情可能會導致這樣的頭痛。 – Freddy 2013-05-11 15:36:00

+4

或者,您可以對第一個紋理使用新佈局(binding = 0),對第二個紋理使用佈局(binding = 1),則不需要設置制服。當然,你需要OpenGL4.2 ... – fluffels 2013-05-17 07:49:20