OpenGL学习笔记-十二-混合
在之前的文章中提到,fragshader最终输出一个vec4的颜色值.然而,对于一个颜色我们只需要rgb三个分量就够了,最后一个分量是干嘛的呢?
最后一个通道是alpha通道,表示颜色的透明程度.对于一些图片来说,不如说草,我们不要其中的一些像素,这是透明通道就派上用场了.
上图草的背景我们是不需要的,设置透明度为0,需要的部分则为1.
但是我们并没有告诉OpenGL如何处理透明通道.所以在片段着色器中我们写下如下代码:
vec4 texColor = texture(texture1, TexCoords); |
使用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: 反向减去
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 VanishingBlog!