六、OpenGL中的颜色混合

 我来答
舒适还明净的海鸥i
2022-06-15 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:69.8万
展开全部
一、原因

那么如果开启深度测试后.但是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 )
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式