混合
什么是混合?
- 在图形接口中,这里指OpenGL,混合是实现透明的一种技术,实现了可以透过前面透明或半透明物体看到后面物体的效果
- 混合在“微观”层面指的是:对当前片段在片段着色器输出的颜色与颜色缓冲中的颜色进行某种操作后,得到的颜色
- 因此,混合在光栅化中的位置是:在片段着色器运行之后,并且在所有的测试都通过之后,再进行混合操作
为什么需要混合?
- 当然是为了实现透明效果
怎么实现混合?
透明度的表示
- 物体或者纹理的透明度是通过颜色的第四个通道alpha表达的,0.0表示完全透明,1.0表示不透明;因此假如一个像素的颜色的alpha是0.3,那么就表示他有70%的透明度
加载、创建透明纹理
- 当要加载或者创建一个透明纹理时,这个纹理的内外部格式应当是GL_RGBA
控制函数
-
开启——glEnable(GL_BLEND)
-
设置混合函数——glBlendFunc(sfactor, dfactor)
- sfactor:源因子,指定该片段的alpha值对该片段源颜色的影响程度
- dfactor:目标因子,指定该片段的alpha值对该片段的目标颜色的影响程度
- 这两个参数的选项有:GL_ONE、GL_ZENO、GL_SRC_COLOR等14种
- 源颜色:源自纹理的颜色
- 目标颜色:当前存储在颜色缓冲中的颜色
- 在默认情况下的混合算法是: C r C_r Cr = C s C_s Cs * sfactor + C d C_d Cd * dfactor
-
设置混合运算符——glBlendEquation(mode),mode的选项有三种:
- GL_FUNC_ADD,默认设置,就是上面提到的默认混合算法, C r C_r Cr = Src + Des
- GL_FUNC_SUBTRACT,将两个分量相减, C r C_r Cr = Src - Des
- GL_FUNC_REVERSE_SUBTRACT,将两个分量颠倒后再相减, C r C_r Cr = Des - Src
警惕
深度测试与混合一起使用
- 当深度测试与混合一起使用,由于片段写入深度缓冲时,不会检查该片段是否透明,因此透明的片段也会被写到深度缓冲中,这就可能造成:本该保留的片段,在深度测试时被丢弃
解决办法
- 在观察者方向上,根据物体距观察者的距离,由远到近依次绘制,大致过程如下:
- 绘制不透明的物体
- 对透明物体排序
- 按顺序绘制透明物体