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