混合
文章目录
- 混合
- 混合公式
- glBlendFunc(混合函数)
- glBlendFuncSeparate
- 渲染半透明纹理
- 参考链接
混合(Blending)通常是实现物体透明度(Transparency)的一种技术
简而言之:混合就是如何将输出颜色和目标缓冲区颜色结合起来。
混合公式
C_final = f_source * C_source op f_destination * C_destination。
- 输入片段的颜色和Alpha通常称为源颜色分量和源Alpha,目标像素的颜色和Alpha则称为目标颜色分量和目标Alpha。
- f_source是输入片段(源)的混合因子;
- C_source是输入片段(源)的颜色;
- C_source是输入片段(源)的颜色;
- C_destination是目标像素(目标)的颜色;
- op是混合运算符,可以是GL_FUNC_ADD(前后两项相加),GL_FUNC_SUBTRACT(前后两项相减),GL_FUNC_REVERSE_SUBTRACT(前后两项相减,但顺序相反)。
glBlendFunc(混合函数)
中文版参数显示不全,建议看英文版或者docs.gl
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR)
glBlendEquation(GL_FUNC_ADD) //默认相加
- 源颜色 W(0.3,0.4,0.7,0.5)
- 目标颜色: X(0.8,0.2,0.3,0.1)
- GL_SRC_ALPHA:取
- 最终结果为 (0.5,0.5,0.5,0.5) * W(0.3,0.4,0.7,0.5) +
(1-0.8,1-0.2,1-0.3,1-0.1) * X(0.8,0.2,0.3,0.1)
glBlendFuncSeparate
就是通过四个分量设置
void glBlendFuncSeparate(
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
渲染半透明纹理
- 先渲染不透明物体
- 再按顺序渲染半透明物体
如何排序?
按照相机位置到物体位置的距离大小来排序。
关于是否使用深度写入的问题?
- 如果透明物体不交叉重叠,可以不用深度写入
参考链接
可视化混合函数
docs.gl
Blend