在之前的文章中提到,fragshader最终输出一个vec4的颜色值.然而,对于一个颜色我们只需要rgb三个分量就够了,最后一个分量是干嘛的呢?

最后一个通道是alpha通道,表示颜色的透明程度.对于一些图片来说,不如说草,我们不要其中的一些像素,这是透明通道就派上用场了.
草

上图草的背景我们是不需要的,设置透明度为0,需要的部分则为1.

但是我们并没有告诉OpenGL如何处理透明通道.所以在片段着色器中我们写下如下代码:

vec4 texColor = texture(texture1, TexCoords);
if(texColor.a < 0.1)
discard;
FragColor = texColor;

使用discard命令丢弃透明度小于0.1的像素,这样就能达到透明效果.

但是对于一些别的半透明物品,比如玻璃,我们不能直接丢弃像素,而是需要按照某种规则进行和混合.

为了达到效果,我们首先要开启混合

glEnable(GL_BLEND);

启用混合后,我们需要告诉OpenGL如何混合颜色.
OpenGL使用这个方程混合颜色:
混合颜色方程

其中:

  • Cs:源颜色
  • Cd:目标颜色,color buffer中当前像素的颜色
  • Fs:源因子
  • Fd:目标因子,color buffer中当前像素的alpha通道值

我们可以设置因子:

  • GL_ZERO: 0
  • GL_ONE: 1
  • GL_SRC_COLOR: 因子等于源颜色Cs
  • GL_ONE_MINUS_SRC_COLOR: 因子等于1减去源颜色Cs
  • GL_DST_COLOR: 因子等于目标颜色Cd
  • GL_ONE_MINUS_DST_COLOR: 因子等于1减去目标颜色Cd
  • GL_SRC_ALPHA: 因子等于源颜色的alpha通道值Fs
  • GL_ONE_MINUS_SRC_ALPHA: 因子等于1减去源颜色的alpha通道值Fs
  • GL_DST_ALPHA: 因子等于目标颜色的alpha通道值Fd
  • GL_ONE_MINUS_DST_ALPHA: 因子等于1减去目标颜色的alpha通道值Fd
  • GL_CONSTANT_COLOR: 因子等于常量颜色
  • GL_ONE_MINUS_CONSTANT_COLOR: 因子等于1减去常量颜色
  • GL_CONSTANT_ALPHA: 因子等于常量alpha值
  • GL_ONE_MINUS_CONSTANT_ALPHA: 因子等于1减去常量alpha值

使用这个函数更改混合因子:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

我们还可以更改方程右边中间的运算符.
使用:

glBlendEuqation(GL_FUNC_ADD);

有三个选项:

  • GL_FUNC_ADD: 相加
  • GL_FUNC_SUBTRACT: 减去
  • GL_FUNC_REVERSE_SUBTRACT: 反向减去