OpenGL 片段着色器 Return 固定纹理颜色
OpenGL Fragment Shader Return Fixed Color for Texture
我有下面的片段着色器,目前 returns 来自纹理的像素颜色:
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform vec4 vColor4;
void main()
{
gl_FragColor = texture2D( s_texture, v_texCoord );
//gl_FragColor = vColor4;
}
如何更改片段着色器,使其 returns 像素打开时为固定颜色,像素关闭时为透明?
我使用的 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)。
听起来您需要启用混合和混合功能(可能还使用 glBlendEquation
的特定方程)。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
查看不同混合方程结果的出色测试器是 here
我有下面的片段着色器,目前 returns 来自纹理的像素颜色:
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform vec4 vColor4;
void main()
{
gl_FragColor = texture2D( s_texture, v_texCoord );
//gl_FragColor = vColor4;
}
如何更改片段着色器,使其 returns 像素打开时为固定颜色,像素关闭时为透明?
我使用的 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)。
听起来您需要启用混合和混合功能(可能还使用 glBlendEquation
的特定方程)。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
查看不同混合方程结果的出色测试器是 here