混色的概念

所谓的混色,就是将当前要绘制的物体的颜色和颜色缓冲区中已经绘制的颜色进行混合,最终决定了当前物体的颜色。
如下图中,我们透过不透明的窗户来看窗外的景色,这就是一种混色。

透明的物体可以是完全透明的(让所有的颜色都穿过),或者是半透明的(让颜色穿过,同时也显示自身的颜色)。
一个物体的透明度是通过它颜色的Alpha值来决定的。Alpha颜色值是颜色分量的第四个分量。
如果是不透明的物体,那么其透明度就为0.0
比如上图中的窗户,玻璃部分的Alpha值为0.25(其在一般情况下是完全的红色,但是有75%的透明度,能让很大一部分的背景颜色穿过,让它不是那么红了)。边框的Alpha值为1.0(完全不透明)。

丢弃片段 discard

GLSL中的命令,一旦被调用,就会保证片段不会进一步被处理,就不会进入颜色缓冲。

启用了混合,我们就不需要丢弃片段了。

混色在程序中的实现

启用混色的命令。

glEnable(GL_BLEND);

启用了混色之后,需要告诉OpenGL它该如何混合。

OpenGL中的混合是通过这个方程来实现的:
C¯result=C¯source∗Fsource+C¯destination∗Fdestination C ¯ r e s u l t = C ¯ s o u r c e ∗ F s o u r c e + C ¯ d e s t i n a t i o n ∗ F d e s t i n a t i o n \begin{equation}\bar{C}_{result} = \bar{\color{green}C}_{source} * \color{green}F_{source} + \bar{\color{red}C}_{destination} * \color{red}F_{destination}\end{equation}

  • C¯source C ¯ s o u r c e \bar{\color{green}C}_{source}:源颜色向量。这是源自纹理的颜色向量。
  • C¯destination C ¯ d e s t i n a t i o n \bar{\color{red}C}_{destination}:目标颜色向量。这是当前储存在颜色缓冲中的颜色向量。
  • Fsource F s o u r c e \color{green}F_{source}:源因子值。指定了alpha值对源颜色的影响。
  • Fdestination F d e s t i n a t i o n \color{red}F_{destination}:目标因子值。指定了alpha值对目标颜色的影响。

通过函数glBlendFunc来设置源和目标因子。

glBlendFunc(GLenum Source_factor, GLenum Destination_factor);//源和目标因子

见下表,OpenGL为我们定义了很多个选项,常数颜色

选项
GL_ZERO 因子等于0
GL_ONE 因子等于1
GL_SRC_COLOR 因子等于源颜色向量 C¯source C ¯ s o u r c e \bar{\color{green}C}_{source}
GL_ONE_MINUS_SRC_COLOR 因子等于 1−C¯source 1 − C ¯ s o u r c e 1 - \bar{\color{green}C}_{source}
GL_DST_COLOR 因子等于目标颜色向量 C¯destination C ¯ d e s t i n a t i o n \bar{\color{red}C}_{destination}
GL_ONE_MINUS_DST_COLOR 因子等于 1−C¯destination 1 − C ¯ d e s t i n a t i o n 1 - \bar{\color{red}C}_{destination}
GL_SRC_ALPHA 因子等于 C¯source C ¯ s o u r c e \bar{\color{green}C}_{source}的alpha分量
GL_ONE_MINUS_SRC_ALPHA 因子等于1− C¯source C ¯ s o u r c e \bar{\color{green}C}_{source}的alpha分量
GL_DST_ALPHA 因子等于 C¯destination C ¯ d e s t i n a t i o n \bar{\color{red}C}_{destination}的alpha分量
GL_ONE_MINUS_DST_ALPHA 因子等于1- C¯destination C ¯ d e s t i n a t i o n \bar{\color{red}C}_{destination}的alpha分量
GL_CONSTANT_COLOR 因子等于常数颜色向量 C¯constant C ¯ c o n s t a n t \bar{\color{blue}C}_{constant}
GL_ONE_MINUS_CONSTANT_COLOR 因子等于 1−C¯constant 1 − C ¯ c o n s t a n t 1 - \bar{\color{blue}C}_{constant}
GL_CONSTANT_ALPHA 因子等于 C¯constant C ¯ c o n s t a n t \bar{\color{blue}C}_{constant} 的alpha分量
GL_ONE_MINUS_CONSTANT_ALPHA 因子等于 1−C¯constant 1 − C ¯ c o n s t a n t 1- \bar{\color{blue}C}_{constant}的alpha分量

比如我们想要设置这样的Blend:

C¯result=⎛⎝⎜⎜⎜0.01.00.00.6⎞⎠⎟⎟⎟∗0.6+⎛⎝⎜⎜⎜1.00.00.01.0⎞⎠⎟⎟⎟∗(1−0.6) C ¯ r e s u l t = ( 0.0 1.0 0.0 0.6 ) ∗ 0.6 + ( 1.0 0.0 0.0 1.0 ) ∗ ( 1 − 0.6 ) \begin{equation}\bar{C}_{result} = \begin{pmatrix} \color{red}{0.0} \\ \color{green}{1.0} \\ \color{blue}{0.0} \\ \color{purple}{0.6} \end{pmatrix} * \color{green}{0.6} + \begin{pmatrix} \color{red}{1.0} \\ \color{green}{0.0} \\ \color{blue}{0.0} \\ \color{purple}{1.0} \end{pmatrix} * \color{red}{(1 - 0.6)} \end{equation}

使用源颜色向量的alpha作为源因子,使用1−alpha作为目标因子。这将会产生以下的glBlendFunc

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

不同于函数glBlendFunc,也可以使用glBlendFuncSeparateRGBalpha通道分别设置不同的选项:

glBlendFuncSeparate(GLenum srcRGB, GLenum destRGB, GLenum srcAlpha, GLenum destAlpha);
//参数srcRGB表示颜色值的源混合因子
//参数destRGB表示颜色值的目标混合因子
//参数srcAlpha表示Alpha值的源混合因子
//参数destAlpha表示Alpha值的目标混合因子  

OpenGL中的Blend(混色)相关推荐

  1. OpenGL中的混色问题(Alpha通道)

    混合是一种常用的技巧,通常可以用来实现半透明.但其实它也是十分灵活的,你可以通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象. 混合是什么呢?混合就是把两种颜色混在一起.具体一点,就是把某 ...

  2. OpenGL中的颜色再次讨论

    一.经过这篇文章后,你将学会如下技能: 1.混合颜色来取得像半透明这样的效果. 2.对于锯齿边缘线和多边形变进行平滑处理. 3.创造真实的大气效果. 二. 1. 如果对OpenGL的透明玻璃效果很好奇 ...

  3. OpenGL中的曲面细分和几何着色器

    [摘要]本文我们先介绍OpenGL中的曲面细分的一些基本概念,然后给两个例子说明不得不用这项技术的理由. 曲面细分是OpenGL 4.0之后才定义的功能,使用之前请确认你的显卡驱动支持OpenGL4. ...

  4. 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqYroW 可交互视频 此视频是可 ...

  5. xyz坐标图_“色觉地图”的建立(二):辐照度与亮度、rgb空间、“颜色图”的混色方式...

    上篇""色觉地图"的建立(一):光感受器.色匹配实验与CIE RGB坐标系"中说到,人的色觉是线性的,我们可以用叠加原理"混色"--这意味着 ...

  6. OpenGL中常用的 GLUT 函数

    GLUT函数说明 一.初始化 void glutInit(int* argc,char** argv) 这个函数用来初始化GLUT库.对应 main 函数的形式应是: int main(int arg ...

  7. 照明案例:混色导光管

    发光二极管,或者LED,近几年已经超越了白炽灯光源,应用也越来越广泛.LED具有尺寸小.发光效率高.使用寿命长[1]等优点.LED也有光学工程师必须处理的不良特性,比如混色和准直的需要.在这个例子中, ...

  8. 【色彩L4笔记:混色】

    文章目录 混色 色阶的深层理解 混色 色阶在画场景时如何应用 总结 小灶tips 混色 这堂课主要顺延L3,具体解释了色阶系统,并引出了一个常用的作画逻辑.之后讲解了混色的使用,以及色阶在画场景的作用 ...

  9. opengl中解决红蓝色颠倒的问题

    本文出自HEHE的opengl的第35课 播放avi 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效 ...

最新文章

  1. 如何判断应用已经安装,如何判断Service,BroastCastReceiver,ContentProvider是否存在...
  2. iOS源码学习总结框架
  3. JavaScript 开发的40个经典技巧
  4. anaconda中安装xgboost_Anaconda是什么?Anconda下载安装教程 - python基础入门(16)
  5. 简述与oracle相关的程序组,北语网院18秋《Oracle数据库开发》作业_4答案
  6. 运算放大器基本公式_还在被三阶/四阶/运算放大器滤波器PLL这些概念困扰?这篇文章帮你搞懂它...
  7. cent os mysql 内存_Cent OS – MySQL – 主从配置
  8. 人生苦短,我用python-- Day6 面向对象
  9. [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
  10. 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
  11. java 垃圾回收入门
  12. 手把手教你升级到MySQL 8.0
  13. DDS通信协议与安全实践
  14. 个税抵扣全指南精华版!
  15. 【系】微信小程序云开发实战坚果商城-云开发之分类数据实现
  16. HDLCoder的系统设计
  17. 计算机学报论文审稿流程,计算机学报投稿.docx
  18. undo歌词中文音译_Undo - Sanna nielsen帮我看看这歌词翻译对么
  19. 自愈的三把钥匙:接受,改变,离开
  20. linux查询服务器域名解析记录

热门文章

  1. 计算机应用研究投稿后多久收到回信,SCI投稿后,如何答复审稿人的回信技巧总结...
  2. 红米k30至尊纪念版刷鸿蒙系统,红米k30s至尊纪念版MIUI刷机包
  3. 有趣的外文机器学习资源
  4. 电容笔和Apple pencil有什么区别?Ipad主动式电容笔推荐
  5. 设计模式详解(总纲)看了这篇文章还不会,你拍我
  6. eNSP AR1启动失败的解决办法
  7. java基于寄存器_周志明的《深入理解JAVA虚拟机》中基于栈的指令集和基于寄存器的指令集,要好好学习...
  8. 荣耀magic5参数 荣耀magic5评测 怎么样
  9. iphone自适应屏幕亮度_如何在iPhone或iPad上调整屏幕亮度
  10. LoadRunner打开IE8后报错