六、OpenGL中的颜色混合
展开全部
一、原因
那么如果开启深度测试后.但是2个重叠的图层中, 有⼀个图层是半透明的. 有⼀个图层是⾮半透明的.
那么此时就不能进⾏单纯的 ⽐较深度值,然后进⾏覆盖. 显示如下图所示:
未使用混合时的显示
其实上面的这样的显示明显是不正确的,为了解决这样的问题,我们需要使用混合。
在OpenGL中,物体透明技术通常被叫做混合(Blending)。
我们先来看看使用混合时显示,如下图所示:
使用混合时的显示
二、混合颜色
目标颜色 已经存储在颜色缓存区的颜色值
源颜色 作为当前渲染命令结果进入颜色缓存区的颜色值
当混合功能被启动时,源颜色和⽬标颜色的组合方式是混合方程式控制的。在默认情况下,混合⽅方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最终计算参数的颜色
Cs : 源颜色
Cd :目标颜色
S:源混合因子
D:⽬标混合因子
三、如何使用
1. 开启OpenGL的混合功能
glEnable(GL_BLEND);
2.关闭OpenGL的混合功能
glDisable(GL_BLEND);
3.设置混合因子
glBlendFunc(GLenum S,GLenum D)
S:源混合因⼦子
D:⽬目标混合因⼦子
混合因子如下图:
表中R、G、B、A 分别代表 红、绿、蓝、alpha。
表中下标S、D,分别代表源、⽬标
表中C 代表常量颜⾊(默认⿊⾊)
四、模拟案例
下⾯通过一个常见的混合函数组合来说明问题:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 如果颜⾊缓存区已经有一种颜色红色(1.0f,0.0f,0.0f,0.0f),这个目标颜色Cd,如果在这上面用⼀种alpha为0.6的蓝⾊色(0.0f,0.0f,1.0f,0.6f)
Cd (⽬目标颜⾊色) = (1.0f,0.0f,0.0f,0.0f)
Cs (源颜⾊色) = (0.0f,0.0f,1.0f,0.6f);
S = 源alpha值 = 0.6f
D = 1 - 源alpha值= 1-0.6f = 0.4f
⽅方程式Cf = (Cs * S) + (Cd * D)
等价于 = (Blue * 0.6f) + (Red * 0.4f)
五、修改颜⾊混合⽅程式
默认混合⽅程式:
Cf = (Cs * S) + (Cd * D)
实际上远不⽌这⼀种混合⽅程式,我们可以从5个不同的⽅程式中进⾏选择 :
1.//选择混合⽅程式的函数:
2.glbBlendEquation(GLenum mode);
1 常量混合颜⾊,默认初始化为⿊⾊(0.0f,0.0f,0.0f,0.0f),但是还是可以修改这个常量混
合颜⾊。
2 void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclam
pf alpha );
除了能使用glBlendFunc 来设置混合因子,还可以有更灵活的选择:
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
strRGB: 源颜色的混合因子
dstRGB: ⽬标颜色的混合因子
strAlpha: 源颜色的Alpha因子
dstAlpha: ⽬标颜色的Alpha因子
glBlendFunc指定源和⽬标 RGBA值的混合函数;
glBlendFuncSeparate函数则允许为RGB 和 Alpha 成分单独指定混合函数
GL_CONSTANT_COLOR、GL_ONE_MINUS_CONSTANT_COLOR、GL_CONSTANT_ALPHA、GL_ONE_MINUS_CONSTANT值允许混合方程式中引入一个常量混合颜色。
常量混合颜色,默认初始化为⿊色(0.0f,0.0f,0.0f,0.0f)
修改常量混合颜色
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha )
那么如果开启深度测试后.但是2个重叠的图层中, 有⼀个图层是半透明的. 有⼀个图层是⾮半透明的.
那么此时就不能进⾏单纯的 ⽐较深度值,然后进⾏覆盖. 显示如下图所示:
未使用混合时的显示
其实上面的这样的显示明显是不正确的,为了解决这样的问题,我们需要使用混合。
在OpenGL中,物体透明技术通常被叫做混合(Blending)。
我们先来看看使用混合时显示,如下图所示:
使用混合时的显示
二、混合颜色
目标颜色 已经存储在颜色缓存区的颜色值
源颜色 作为当前渲染命令结果进入颜色缓存区的颜色值
当混合功能被启动时,源颜色和⽬标颜色的组合方式是混合方程式控制的。在默认情况下,混合⽅方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最终计算参数的颜色
Cs : 源颜色
Cd :目标颜色
S:源混合因子
D:⽬标混合因子
三、如何使用
1. 开启OpenGL的混合功能
glEnable(GL_BLEND);
2.关闭OpenGL的混合功能
glDisable(GL_BLEND);
3.设置混合因子
glBlendFunc(GLenum S,GLenum D)
S:源混合因⼦子
D:⽬目标混合因⼦子
混合因子如下图:
表中R、G、B、A 分别代表 红、绿、蓝、alpha。
表中下标S、D,分别代表源、⽬标
表中C 代表常量颜⾊(默认⿊⾊)
四、模拟案例
下⾯通过一个常见的混合函数组合来说明问题:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 如果颜⾊缓存区已经有一种颜色红色(1.0f,0.0f,0.0f,0.0f),这个目标颜色Cd,如果在这上面用⼀种alpha为0.6的蓝⾊色(0.0f,0.0f,1.0f,0.6f)
Cd (⽬目标颜⾊色) = (1.0f,0.0f,0.0f,0.0f)
Cs (源颜⾊色) = (0.0f,0.0f,1.0f,0.6f);
S = 源alpha值 = 0.6f
D = 1 - 源alpha值= 1-0.6f = 0.4f
⽅方程式Cf = (Cs * S) + (Cd * D)
等价于 = (Blue * 0.6f) + (Red * 0.4f)
五、修改颜⾊混合⽅程式
默认混合⽅程式:
Cf = (Cs * S) + (Cd * D)
实际上远不⽌这⼀种混合⽅程式,我们可以从5个不同的⽅程式中进⾏选择 :
1.//选择混合⽅程式的函数:
2.glbBlendEquation(GLenum mode);
1 常量混合颜⾊,默认初始化为⿊⾊(0.0f,0.0f,0.0f,0.0f),但是还是可以修改这个常量混
合颜⾊。
2 void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclam
pf alpha );
除了能使用glBlendFunc 来设置混合因子,还可以有更灵活的选择:
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
strRGB: 源颜色的混合因子
dstRGB: ⽬标颜色的混合因子
strAlpha: 源颜色的Alpha因子
dstAlpha: ⽬标颜色的Alpha因子
glBlendFunc指定源和⽬标 RGBA值的混合函数;
glBlendFuncSeparate函数则允许为RGB 和 Alpha 成分单独指定混合函数
GL_CONSTANT_COLOR、GL_ONE_MINUS_CONSTANT_COLOR、GL_CONSTANT_ALPHA、GL_ONE_MINUS_CONSTANT值允许混合方程式中引入一个常量混合颜色。
常量混合颜色,默认初始化为⿊色(0.0f,0.0f,0.0f,0.0f)
修改常量混合颜色
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha )
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询