OpenGL 基础渲染(颜色混合)

2020-07-21  本文已影响0人  _涼城

OpenGL 混合

  OpenGL渲染时会把颜色值存在颜色缓存区中,每个片段的深度值也是放在深度缓冲区。当深度缓冲区关闭时,新的颜色将简单的覆盖原来颜色缓存区存在的颜色值。当深度缓冲区被打开时,新的颜色片段只是当它们比原来的值更接近邻进的裁剪平面才会替换原来的颜色片段。

  当2个重叠的图层,上面图层是半透明的情况下。则不能单纯的比较深度值进行覆盖,而是需要将2个图层的颜色进行混合。当打开了OpenGL的混合功能后,下层的颜色值就不会被清除。

glEnable(GL_BLEND);
目标颜色

  已经存储在颜色缓冲区中的颜色值称为目标颜色。

源颜色

  作为当前渲染命令的结果进入颜色缓冲区的颜色值称为源颜色。

混合方程式

  当混合功能启用时,源颜色和目标颜色的组合方式是混合方程式控制的。在默认情况下,混合方程式如下所示。

Cf = (Cs * S) + (Cd *D)

  其中,Cf是最终计算产生的颜色,Cs是源颜色,Cd是目标颜色,SD分别是源和目标混合因子。

混合因子

混合因子通过下面这个函数设置

glBlendFunc(GLenum S,GLenum D);

下表是混合函数可以用的值,用于求混合因子。

函数 RGB混合因子 Alpha混合因子
GL_ZERO (0,0,0) 0
GL_ONE (1,1,1) 1
GL_SRC_COLOR (R_s,G_s,B_s) A_s
GL_ONE_MINUS_SRC_COLOR (1,1,1) - (R_s,G_s,B_s) 1-A_s
GL_DST_COLOR (R_d,G_d,B_d) A_d
GL_ONE_MINUS_DST_COLOR (1,1,1) - (R_d,G_d,B_d) 1-A_d
GL_SRC_ALPHA (A_s,A_s,A_s) A_s
GL_ONE_MINUS_SRC_ALPHA (1,1,1) - (A_s,A_s,A_s) 1-A_s
GL_DST_ALPHA (A_d,A_d,A_d) A_d
GL_ONE_MINUS_DST_ALPHA (1,1,1)-(A_d,A_d,A_d) 1-A_d
GL_CONSTANT_COLOR (R_c,G_c,B_c) A_c
GL_ONE_MINUS_CONSTANT_COLOR (1,1,1)-(R_c,G_c,B_c) 1-A_c
GL_CONSTANT_ALPHA (A_c,A_c,A_c) A_c
GL_ONE_MINUS_CONSTANT_ALPHA (1,1,1)-(Ac,Ac,Ac) 1-A_c
GL_SRC_ALPHA_SATURATE (f,f,f)*,f=min(A_s,1-A_d) 1

例:glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

C_d(目标颜色) =(1.0f,0.0f,0.0f,1.0f)
Cs(源颜色) = (0.0f,0.0f,1.0f,0.6f)
S=源alpha值=0.6f
D=1-源alpha值 = 0.4f

现在方程式Cf = (Cs * S) + (Cd *D)等价于Cf = (Cs * 0.6) + (Cd *0.4)

  最终颜色中,源颜色的alpha值越高,添加的源颜色成分越高,目标颜色所保留的成分就会越少。

  混合函数常用于其它一些不透明的物体前面绘制一个透明物体的效果。

可用的混合方程式
模式 函数
GL_FUNC_ADD C_f = (C_s * S) + (C_d * D)
GL_FUNC_SUBTRACT C_f = (C_s * S) - (C_d * D)
GL_FUNC_REVERSE_SUBTRACT C_f = (C_d * D) + (C_s * S)
GL_MIN C_f = min(C_s,C_d)
GL_MAX C_f = max(C_s,C_d)
指定的混合函数

  除了glBlendFunc之外,还可以利用下面的函数灵活设置混合。

void glBlendFuncSpearate(GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha);
常量混合颜色

  通过下面这个方法可用设置常量混合颜色,常量混合颜色初始为黑色。

void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
上一篇下一篇

猜你喜欢

热点阅读