更新:Danvil が以下のコメントで解決しました。私のテクスチャ フォーマットは GL_RGBA ではなく GL_RGB でした。これはもちろん、アルファ値が保持されないことを意味します。なぜ気づかなかったのかわからない... ありがとう、ダンヴィル。
GLSL シェーダを使用してテクスチャにレンダリングし、そのテクスチャを入力として 2 番目のシェーダに送信しています。最初のテクスチャでは、RGB チャネルを使用してカラー データを 2 番目の GLSL シェーダに送信していますが、アルファ チャネルを使用して、2 番目のシェーダがプログラムの一部として使用する浮動小数点数を送信したいと考えています。問題は、2 番目のシェーダーでテクスチャを読み取ると、アルファ値が常に 1.0 になることです。これを次の方法でテストしました。
最初のシェーダーの最後に、次のようにしました。
gl_FragColor = vec4(r, g, b, 0.1);
次に、2番目のテクスチャで、次のようなものを使用して最初のテクスチャの値を読み取ります
vec4 f = texture2D(previous_tex, pos);
if (f.a != 1.0) {
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
出力に黒のピクセルはありませんが、上記のコードを読み取りに変更すると
gl_FragColor = vec4(r, g, 0.1, 1.0); //Notice I'm now sending 0.1 for blue
そして2番目のシェーダーで
vec4 f = texture2D(previous_tex, pos);
if (f.b != 1.0) {
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
該当するピクセルはすべて黒です。これは、何らかの理由で、最初のシェーダーでアルファ値を 1.0 以外に設定してテクスチャにレンダリングすると、2 番目のシェーダーでは 1.0 として表示されることを意味します。
テクスチャにレンダリングする前に glDisable(GL_BLEND);
問題は、私が望む方法で青チャネルを使用できるため、私には明らかではない方法でアルファ値を処理する OpenGL に関係していることは明らかであり、そこにいる誰かがすぐに問題に気付くと考えました。 .
また、シェーダー プログラムを呼び出す方法は、クワッドを描画することです (テクスチャを持つフレーム バッファーにレンダリングしています)。
gl.glUseProgram(shaderprogram);
gl.glUniform1iARB(gl.glGetUniformLocationARB(shaderprogram, "previous_tex"), 1);
gl.glDisable(GL.GL_BLEND);
gl.glBegin(GL.GL_QUADS);
{
gl.glVertex3f(0.0f, 1.0f, 1.0f);
gl.glVertex3f(1.0f, 1.0f, 1.0f);
gl.glVertex3f(1.0f, 0.0f, 1.0f);
gl.glVertex3f(0.0f, 0.0f, 1.0f);
}
gl.glEnd();
gl.glUseProgram(0);