【OpenGL】七、混合

混合

文章目录

  • 混合
    • 混合公式
    • glBlendFunc(混合函数)
    • glBlendFuncSeparate
    • 渲染半透明纹理
  • 参考链接


混合(Blending)通常是实现物体透明度(Transparency)的一种技术
简而言之:混合就是如何将输出颜色目标缓冲区颜色结合起来。


混合公式

C_final = f_source * C_source op f_destination * C_destination。
  • 输入片段的颜色和Alpha通常称为源颜色分量和源Alpha目标像素的颜色和Alpha则称为目标颜色分量和目标Alpha
  1. f_source是输入片段(源)的混合因子;
  2. C_source是输入片段(源)的颜色;
  3. C_source是输入片段(源)的颜色;
  4. C_destination是目标像素(目标)的颜色;
  5. 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)

【OpenGL】七、混合_第1张图片


glBlendFuncSeparate

就是通过四个分量设置

void glBlendFuncSeparate(	
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);

渲染半透明纹理

  • 先渲染不透明物体
  • 再按顺序渲染半透明物体

如何排序?
按照相机位置到物体位置的距离大小来排序。

关于是否使用深度写入的问题?

  • 如果透明物体不交叉重叠,可以不用深度写入

参考链接

可视化混合函数

docs.gl

Blend

你可能感兴趣的:(计算机图形学之旅,c++,图形渲染,游戏引擎,1024程序员节)