OpenGL 颜色混合原理

1,005 阅读3分钟

注:本文旨在记录笔者的学习过程,仅代表笔者个人的理解,如果有表述不准确的地方,欢迎各位指正!因为涉及到的概念来源自网络,所以如有侵权,也望告知!

前言

本文重点是理解OpenGL在渲染像素颜色时对颜色进行混合的处理过程。

正文

在大家小时候上美工课时就会有一个认知,当你将红色的颜料和绿色的颜料混合到一起以后,颜料的颜色就会改变,就如同下面这个图片所展示的那样:但是大家可能并不了解,在计算机的世界里究竟是怎么完成的。那接下来我就从OpenGL的颜色处理给大家讲解一下这个实现原理。

颜色混合方程

OpenGL在渲染过程中会把颜⾊值存在颜⾊缓存区中,已经存储在颜⾊缓存区的颜⾊值我们称为目标颜色,这个时候作为当前渲染命令结果进⼊颜⾊缓存区的颜⾊值我们称为源颜色。当你通过glEnable(GL_BlEND)启动OpenGL混合功能时,源颜⾊和⽬标颜⾊的组合⽅式是混合⽅程式控制的。在默认情况下,混合⽅程式如下所示:
       Cf = (Cs * S) + (Cd * D)
           Cf :最终计算参数的颜⾊
           Cs :源颜⾊
           Cd :⽬标颜⾊
           S:源混合因⼦
           D:⽬标混合因⼦
实际上OpenGL远不⽌这⼀种混合⽅程式,通过glbBlendEquation(GLenum mode)切换模式,我们可以从5个不同的⽅程式中进⾏选择,但是正常情况下我们并不需要刻意去修改,使用默认方程式即可。

混合因子

从混合方程我们了解到,最终混合后的颜色可以通过设置不同的混合因子来实现,那么在OpenGL中提供了哪些可以选择的混合因子呢?

如图所示,表中R、G、B、A 分别代表 红、绿、蓝、alpha,下标S、D,分别代表源、⽬标,C 代表常量颜⾊(默认⿊⾊)。

设置混合因子,我们需要⽤到glBlendFun函数glBlendFunc(GLenum S,GLenum D),S:源混合因⼦、D:⽬标混合因⼦,但是就同混合方程一样,虽然OpenGL给我们提供了很多选择,但是我们最常用的混合因子是GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA,即glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

案例

假设OpenGL颜⾊缓存区已经有⼀种颜⾊红⾊(1.0f,0.0f,0.0f,1.0f),也就是我们的⽬标颜⾊Cd,这个时候作为当前渲染命令结果进⼊颜⾊缓存区的⼀种颜色alpha为0.6的绿色(0.0f,1.0f,0.0f,0.6f),也就是我们的源颜⾊。然后通过查询OpenGL混合因子的表格,GL_SRC_ALPHA对应的Alpha混合因子为As,GL_ONE_MINUS_SRC_ALPHA对应的Alpha混合因子为1-As。计算过程如下:
      Cd (⽬标颜⾊) = (1.0f,0.0f,0.0f,1.0f);
      Cs (源颜⾊) = (0.0f,1.0f,0.0f,0.6f);
      S = 源alpha值 = 0.6f;
      D = 1 - 源alpha值= 1-0.6f = 0.4f;

通过混合方程可得,Cf = (Cs * S) + (Cd * D) = (Green * 0.6f) +(Red * 0.4f)。最终颜⾊是以原先的红⾊(⽬标颜⾊)与 后来的绿色(源颜⾊)进⾏组合。源颜⾊的alpha值越⾼,添加的绿⾊颜⾊成分越⾼,⽬标颜⾊所保留的成分就会越少。