我有下面的片段着色器,它当前从纹理中返回一个像素的颜色:
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform vec4 vColor4;
void main()
{
gl_FragColor = texture2D( s_texture, v_texCoord );
//gl_FragColor = vColor4;
}
如何更改片段着色器,使其在像素开启时返回固定颜色,在像素关闭时返回透明度?
我正在使用的TGA文件包含透明度,但包含绿色和棕色图像(其基本树图像 - 绿色顶部,棕色树干)。我想要做的是以一种特定的颜色(如轮廓)渲染树的形状,而不是绿色,棕色和透明度。如果我将gl_FragColor更改为设置颜色,那么图像将绘制为实心矩形 - 而不是我想要的。
是否只需要分配固定颜色并使用texture2D返回的alpha(.a?)值?
下面的一行给我一个白色的轮廓但是alpha通道被忽略了所以我得到一个黑色矩形的白树:
gl_FragColor = texture2D( s_texture, v_texCoord ).aaaa;
更新:我尝试了以下内容,但它仍然呈现一个矩形。看来透明度没有加载到我的纹理中。 GIMP肯定是透明的,但由于某种原因,透明度对我来说是白色的。
vec4 tmpColor = texture2D( s_texture, v_texCoord );
tmpColor.r = vColor4.r;
tmpColor.g = vColor4.g;
tmpColor.b = vColor4.b;
// gl_FragColor = texture2D( s_texture, v_texCoord );
//gl_FragColor = vColor4;
gl_FragColor = tmpColor;
我的LoadTexture()函数使用以下参数:
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, TexHandle ); // Set our Tex handle as current
// Specify filtering and edge actions
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
//glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE );
glTexImage2D( GL_TEXTURE_2D,0,GL_RGBA, Img.GetWidth(),Img.GetHeight(),0,
GL_RGBA,GL_UNSIGNED_BYTE,Img.GetImg() );
每像素位数(BPP)绝对是32(R,G,B,A)。
答案 0 :(得分:1)
听起来你需要启用混合和混合功能(可能也是使用glBlendEquation
的特定和方程式)。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
查看不同混合方程结果的优秀测试人员是here