Opengl GLSL着色器渲染到纹理不保存alpha值

Opengl GLSL着色器渲染到纹理不保存alpha值,opengl,glsl,gpgpu,render-to-texture,Opengl,Glsl,Gpgpu,Render To Texture,更新:Danvil在下面的评论中解决了这个问题。我的纹理格式是GL_RGB而不是GL_RGBA,这当然意味着不保留alpha值。不知道为什么我没有意识到。。。谢谢丹维尔 我使用GLSL着色器渲染纹理,然后将该纹理作为输入发送到第二个着色器。对于第一个纹理,我使用RGB通道将颜色数据发送到第二个GLSL着色器,但我希望使用alpha通道发送浮点数,第二个着色器将使用该浮点数作为其程序的一部分。问题是,当我在第二个着色器中读取纹理时,alpha值始终为1.0。我通过以下方式对此进行了测试: 在第一个

更新: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_混合)

我似乎很清楚,这个问题与OpenGL以某种方式处理alpha值有关,而这种方式对我来说并不明显,因为我可以用我想要的方式使用蓝色通道,并且我认为那里的人会立即看到这个问题

此外,我调用着色器程序的方式是绘制一个四边形(我正在渲染到具有纹理的帧缓冲区):


哦,我的glClearColor是0.f,0.f,0.f,0.f,你用的是哪种纹理格式?丹维尔,非常感谢。我完全忘了从RGB换成RGBA。如果你把它作为一个实际的答案,我会把它标记为已回答。哦,现在我正在用橙色的书砸自己的头(我想是想把它敲进去)。
    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);