欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

openGL之颜色混合

程序员文章站 2022-03-22 08:21:59
什么是颜色混合颜色混合就是两种或者多种透明度不为1的颜色混合在一起会产生一种新的颜色,这个过程就是颜色混合。在渲染过程中,颜色都是存放到颜色缓冲区中,两个重叠的图层,在同一个点存储到颜色缓冲区中的颜色只是最上层图层的颜色值。但是如果重叠的图层上面的图层是半透明的,这时就需要将这两个图层的颜色进行混合。什么时候使用颜色混合大前提:不能开启深度测试,如果开启了深度测试,那么颜色混合就会以深度为基础进行渲染。也就是说开启深度测试然后在开启颜色混合会发生问题,例如:有两个正方形A、B,A的深度为2、颜色不透...

1. 颜色混合

颜色混合就是两种或者多种透明度不为1的颜色混合在一起会产生一种新的颜色,这个过程就是颜色混合。

在渲染过程中,颜色都是存放到颜色缓冲区中,两个重叠的图层,在同一个点存储到颜色缓冲区中的颜色只是最上层图层的颜色值。但是如果重叠的图层上面的图层是半透明的,这时就需要将这两个图层的颜色进行混合。

什么时候使用颜色混合

大前提:不能开启深度测试,如果开启了深度测试,那么颜色混合就会以深度为基础进行渲染。也就是说开启深度测试然后在开启颜色混合会发生问题,例如:有两个正方形A、B,A的深度为2、颜色不透明 1、最后绘制;B的深度是1、颜色透明 0.5、先绘制,结果是没有进行颜色混合。 如果AB的深度值置换一下就会混合了;如果AB的绘制顺序置换一下也会混合。(具体怎么造成的暂不清楚)
openGL之颜色混合

固定着色器

两个图层重叠,且最上面图层的透明度不为1,就会进行颜色混合。

可编程着色器

在片元着色器中,处理某个图层上颜色,比如:在A图层上涂上一层薄薄的橘色,就会进行颜色混合。

如何开启、关闭颜色混合

开启颜色混合

glEnable(GL_BLEND);

指定glBlendFunc 颜色混合方程式

// 我们通过控制 S 和 D 混合因子控制混合方程式输出,S 和 D 都是枚举值
void glBlendFunc(CLenum S, GLenum D);
//一般我们是用默认的就可以了,下面是默认方式。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

颜色混合方程式解析

两个颜色进行混合,使用的是下方方程式计算。

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

CS:源颜色 => 将要加入进行混合的颜色
Cd:目标颜色 => 已经存储在颜色缓冲区中的颜色
S:源混合因子
D:目标混合因子

在颜色混合方程式中我们可以设置就是S、D这两个参数,以下是所有的值:
openGL之颜色混合
这些都是不需要记得,我们一般都是使用默认的

/*
Rs/Gs/Bs/As - 源颜色 RGBA 各个通道的混合因子
Rd/Gd/Bd/Ad - 目标颜色 RGBA 各个通道的混合因子
Rc/Gc/Bc/Ac - 常量颜色 RGBA 各个通道的混合因子
Cs = 源颜色 = { 0.0f, 0.0f, 1.0f, 0.7f }
Cd = 目标颜色 = { 1.0f, 0.0f, 0.0f, 1.0f }
As = 源颜色 alpha 值 = 0.7f
Ad = 目标颜色 alpha 值 = 1.0f
S = 源颜色混合因子 = GL_SRC_ALPHA = As = 0.7f
D = 目标颜色混合因子 = GL_ONE_MINUS_SRC_COLOR = 1.0f - As = 0.3f
Cf = 最终产生颜色 = Cs * 0.7f + Cd * 0.3f = {
   0.0f * 0.7f + 1.0f * 0.3f,
   0.0f * 0.7f + 0.0f * 0.3f,
   1.0f * 0.7f + 0.0f * 0.3f,
   0.7f * 0.7f + 1.0f * 0.3f
} = {0.3f,0.0f,0.7f,0.79f}
*/
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

关闭颜色混合

glDisable(GL_BLEND);

2.抗锯齿

在绝大多数情况下,一个独立的渲染片段会映射到计算机上的一个像素。而这些图形的边缘会出现一些吸引眼睛的注意力而让人感觉图形不自然的像素点,称为锯齿。
注:只有在开启混合功能,并且设置了混合因子才可以开启抗锯齿

开启抗锯齿

//开启对点\线\多边形的抗锯齿功能
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);

关闭抗锯齿

glDisable(GL_POINT_SMOOTH);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);

本文地址:https://blog.csdn.net/weixin_40918107/article/details/107288568