OpenGL 混合
OpenGL渲染时会把颜色值存在颜色缓存区中,每个片段的深度值也是放在深度缓冲区。当深度缓冲区关闭时,新的颜色将简单的覆盖原来颜色缓存区存在的颜色值。当深度缓冲区被打开时,新的颜色片段只是当它们比原来的值更接近邻进的裁剪平面才会替换原来的颜色片段。
当2个重叠的图层,上面图层是半透明的情况下。则不能单纯的比较深度值进行覆盖,而是需要将2个图层的颜色进行混合。当打开了OpenGL的混合功能后,下层的颜色值就不会被清除。
glEnable(GL_BLEND);
目标颜色
已经存储在颜色缓冲区中的颜色值称为目标颜色。
源颜色
作为当前渲染命令的结果进入颜色缓冲区的颜色值称为源颜色。
混合方程式
当混合功能启用时,源颜色和目标颜色的组合方式是混合方程式控制的。在默认情况下,混合方程式如下所示。
其中,Cf是最终计算产生的颜色,是源颜色,是目标颜色,和分别是源和目标混合因子。
混合因子
混合因子通过下面这个函数设置
glBlendFunc(GLenum S,GLenum D);
下表是混合函数可以用的值,用于求混合因子。
函数 | RGB混合因子 | Alpha混合因子 |
---|---|---|
GL_ZERO |
||
GL_ONE |
||
GL_SRC_COLOR |
||
GL_ONE_MINUS_SRC_COLOR |
||
GL_DST_COLOR |
||
GL_ONE_MINUS_DST_COLOR |
||
GL_SRC_ALPHA |
||
GL_ONE_MINUS_SRC_ALPHA |
||
GL_DST_ALPHA |
||
GL_ONE_MINUS_DST_ALPHA |
||
GL_CONSTANT_COLOR |
||
GL_ONE_MINUS_CONSTANT_COLOR |
||
GL_CONSTANT_ALPHA |
||
GL_ONE_MINUS_CONSTANT_ALPHA |
||
GL_SRC_ALPHA_SATURATE |
例:glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
现在方程式等价于
最终颜色中,源颜色的alpha值越高,添加的源颜色成分越高,目标颜色所保留的成分就会越少。
混合函数常用于其它一些不透明的物体前面绘制一个透明物体的效果。
可用的混合方程式
模式 | 函数 |
---|---|
GL_FUNC_ADD | |
GL_FUNC_SUBTRACT | |
GL_FUNC_REVERSE_SUBTRACT | |
GL_MIN | |
GL_MAX |
指定的混合函数
除了glBlendFunc
之外,还可以利用下面的函数灵活设置混合。
void glBlendFuncSpearate(GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha);
常量混合颜色
通过下面这个方法可用设置常量混合颜色,常量混合颜色初始为黑色。
void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
网友评论