2013-05-11 17 views
5

2つのテクスチャをGLSLシェーダに送信するときに、実際に1つだけが到着します。私がバインドする最初のテクスチャは、シェーダ内の両方のテクスチャスロットに使用されています。これは、私がOpenGLでのテクスチャを渡す方法が間違っていると信じさせてくれます。しかし、私は問題を追跡することができません。GLSLシェーダに2つのテクスチャを送信

ここでは、シェーダで使用するテクスチャを設定するコードを示します。

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

上記のコードは2つのテクスチャを渡しています。第1のものは、3Dシーンの第1のレンダリングパスの2D画像である。 3つ目は、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(); 
} 

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

私はフラグメントシェーダで最後の2行を切り替えた場合、私はまったく同じ結果が得られます。レンダリングされるテクスチャを変更する唯一の方法は、バインドする順序を変更することです。

たとえば、次のようにすると、最終的に私はぼやけた画像を渡します。もう一度、2つの画像のうちの1つだけを取得します。

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


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

私は何を見落としているのですか?このコードでは

答えて

6

ルック:私は2番目の呼び出しでUniform1 * fが*の代わりに* *

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

あなたがここにいくつかの小さなタイプミスがあり、それがglUniform1する必要があります。この型はシェーダ変数の型と一致しなければならないので、この呼び出しでは何らかのエラーが発生するだけで、均一に初期化されたまま0になり、結果が完全に説明されます。

+0

ありがとうございました!そのような小さなものがそのような頭痛を引き起こす可能性があることは素晴らしいことです。 – Freddy

+4

また、最初のテクスチャに新しいレイアウト(binding = 0)を使用し、2番目のテクスチャにlayout(binding = 1)を使用することができます。その後、ユニフォームを設定する必要はありません。もちろん、OpenGL4.2が必要です... – fluffels

関連する問題