GLSL着色器呈现纹理不保存alpha值

更新:丹维尔在下面的评论中解决了它。 我的纹理格式是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);
链接地址: http://www.djcxy.com/p/33903.html

上一篇: GLSL shader render to texture not saving alpha value

下一篇: i get the texture in opengles,now i want to rotate the texture,but failed