更新:Danvil 在下面的评论中解决了这个问题。我的纹理格式是 GL_RGB 而不是 GL_RGBA 这当然意味着不保留 alpha 值。不知道为什么我没有意识到……谢谢丹维尔。
我正在使用 GLSL 着色器渲染到纹理,然后将该纹理作为输入发送到第二个着色器。对于第一个纹理,我使用 RGB 通道将颜色数据发送到第二个 GLSL 着色器,但我想使用 alpha 通道发送一个浮点数,第二个着色器将用作其程序的一部分。问题是当我在第二个着色器中读取纹理时,alpha 值始终为 1.0。我通过以下方式对此进行了测试:
在第一个着色器结束时,我这样做了:
gl_FragColor = vec4(r, g, b, 0.1);
然后在第二个纹理中,我使用沿线的东西读取第一个纹理的值
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
在第二个着色器中
vec4 f = texture2D(previous_tex, pos);
if (f.b != 1.0) {
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
所有适当的像素都是黑色的。这意味着由于某种原因,当我在第一个着色器中将 alpha 值设置为 1.0 以外的值并渲染到纹理时,第二个着色器仍将其视为 1.0。
在渲染到纹理之前,我 glDisable(GL_BLEND);
对我来说似乎很清楚,问题与 OpenGL 以某种对我来说并不明显的方式处理 alpha 值有关,因为我可以按照我想要的方式使用蓝色通道,并且发现那里的人会立即看到问题.
此外,我调用着色器程序的方式是绘制一个四边形(我正在渲染到具有纹理的帧缓冲区):
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);