私の問題は、GLSLシェーダーで複数のテクスチャにアクセスできるようにすることです。これが私がしていることです:
シェーダー:
uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main( void )
{
vec2 coords = gl_TexCoord[0];
vec4 col = texture2D(sampler0, coords);
vec4 col2 = texture2D(sampler1, coords);
if (blend > 0.5){
gl_FragColor = col;
} else {
gl_FragColor = col2;
}
};
したがって、一様変数に基づいて2つの色の値から選択するだけです。十分に単純ですが(これはテストです)、予想される動作の代わりに、blend<=0.5のときにすべて黒になります。
OpenGLコード:
m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
//lower left
glTexCoord2f(0, 0);
glVertex2f(-1.0, -1.0);
//upper left
glTexCoord2f(0, maxCoords0.t);
glVertex2f(-1.0, 1.0);
//upper right
glTexCoord2f(maxCoords0.s, maxCoords0.t);
glVertex2f(1.0, 1.0);
//lower right
glTexCoord2f(maxCoords0.s, 0);
glVertex2f(1.0, -1.0);
glEnd()
シェーダーはコンパイルされ、このすべての前にバインドされます。そのプロセスのすべての健全性チェックは、問題がないことを示しています。
すでに述べたようにBahbarの返信に従って修正されました。col
、シェーダープログラムのの値は、テクスチャからのフラグメントを反映しています。の値col2
は黒です。表示されるテクスチャは最後にアクティブなテクスチャです。最後glBindTexture
にバインドするように変更するTexture0.Handle
と、テクスチャが変更されます。
gl_FragColor.r = blend;
シェーダーの最後の行のようなものを追加しても、シーンはそのまま黒くなります。ただし、呼び出しをコメントアウトするとglActiveTexture(GL_TEXTURE1);
、シェーダーが再び機能し、sampler0とsampler1の両方に同じテクスチャが表示されます。
どうしたの?問題の行はglActiveTexture(GL_TEXTURE1);
、後続のによって証明されるように、問題なく機能しているようglGetIntegerv(GL_ACTIVE_TEXTURE, &anint)
です。なぜそれはすべてをそれほどひどく壊すのですか?私はすでにディスプレイドライバをアップグレードしようとしました。