五、OpenGL颜色混合

270 阅读2分钟

一、混合方程式

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:⽬标混合因⼦,但是我们最常用的混合因子是GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA。

三、案例解析

void RenderScene(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

//定义4种颜色
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 0.5f };
GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
GLfloat vBlue[] = { 0.0f, 0.0f, 1.0f, 1.0f };
GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };

//将4个固定矩形绘制好
//使用 单位着色器
//参数1:简单的使用默认笛卡尔坐标系(-1,1),所有片段都应用一种颜色。GLT_SHADER_IDENTITY
//参数2:着色器颜色
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);
greenBatch.Draw();

shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
redBatch.Draw();

shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlue);
blueBatch.Draw();

shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlack);
blackBatch.Draw();

//1.开启混合
glEnable(GL_BLEND);
//2.开启组合函数 计算混合颜色因子
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//3.使用着色器管理器
//*使用 单位着色器
//参数1:简单的使用默认笛卡尔坐标系(-1,1),所有片段都应用一种颜色。GLT_SHADER_IDENTITY
//参数2:着色器颜色
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
//4.容器类开始绘制
squareBatch.Draw();

//5.关闭混合功能
glDisable(GL_BLEND);

//同步绘制命令
glutSwapBuffers();
}