我在GLSL中创建了以下着色器,其目的是根据light_text的alpha通道混合2个纹理。不幸的是,alpha通道总是设置为1(而我确信我的原始纹理的值从0到1不等) 我在另一个SO问题中看到我需要将标志GL_RGBA放在某处,因为默认情况下它位于GL_RGB,但是我会把它放在我的例子中? 这是代码:
const vec3 lumCoeff = vec3(0.2125, 0.7154, 0.0721);
uniform sampler2D world_tex;
uniform sampler2D light_tex;
uniform float Alpha;
uniform vec3 NewColor;
void main()
{
vec3 curColor = vec3(texture2D(world_tex, gl_TexCoord[0].xy ));
vec3 lightColor = vec3(texture2D(light_tex, gl_TexCoord[0].xy ));
float graylvl = dot(curColor , lumCoeff);
vec3 appliedLight = lightColor + curColor;
float coeff = texture2D(light_tex, gl_TexCoord[0].xy ).a;// <--- equals 1 always
vec3 color_saturated = mix(vec3(graylvl), curColor, Alpha);
gl_FragColor = vec4( mix(color_saturated + NewColor, appliedLight, coeff) , 1.0);
}
感谢
答案 0 :(得分:1)
这需要在您对glTexImage2D
的一次调用中在GLSL代码之外设置。第三个参数采用内部格式,它应该是GL_RGBA
以及第7个参数,它指定要放入纹理的数据的格式(第7个应该已经设置或者你不会得到任何可用的结果)。
答案 1 :(得分:1)
无处。它是glTexImage2D
的参数,在客户端上传纹理时使用。
答案 2 :(得分:0)
顺便说一下,如果GL_RGB给出了很好的效果,你可能需要先检查纹理。 如果纹理的图像在内部是RGBA数组,那么从第二个像素开始,你会得到噪声,因为第二个像素的alpha分量应该被解释为红色,依此类推。