OpenGL片段着色器返回纹理的固定颜色

时间:2016-04-07 10:16:19

标签: opengl shader opengl-es-2.0 fragment-shader

我有下面的片段着色器,它当前从纹理中返回一个像素的颜色:

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)。

1 个答案:

答案 0 :(得分:1)

听起来你需要启用混合和混合功能(可能也是使用glBlendEquation的特定和方程式)。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

查看不同混合方程结果的优秀测试人员是here