颜色混合

  通常情况下OpenGL渲染时会把颜色值放在颜色缓冲区中。每个片段的深度值也是放在深度缓冲区中的。当深度测试被关闭(禁用)时,新的颜色值简单得覆盖颜色缓冲区中已经存在的其他值。当深度测试被打开(启用)时,新的颜色片段只有当它们比原来的值更接近邻近的裁剪平面时才会替换原来的颜色片段。在正常情况下,任何绘制不是被完全丢弃,就是完全覆盖原来的颜色值,这取决于深度测试的结果。如果打开了OpenGL的混合功能,那么下层的颜色值就不会被清除。

glEnable(GL_BLEND);

在打开混合功能的情况下,新的颜色会与已经存在的颜色值在颜色缓冲区进行组合。这些颜色的组合方式不同会导致很多不同的特殊效果。

组合颜色

  假设绘制这样一个场景:透过红色的玻璃看绿色的物体。那么可以先绘制绿色的物体,再绘制红色的玻璃。在绘制红色的玻璃时,利用颜色混合得到一种新的颜色,使玻璃看起是半透明的。
已经存储在颜色缓冲区中的颜色值叫做目标颜色,即上面的绿色。作为当前渲染命令的结果进入颜色缓冲区的颜色值称为源颜色,即上面玻璃的红色。
当混合功能被开启时,源颜色和目标颜色的组合方式是由混合方程式控制的。默认情况下,混合方程式如下所示。

其中,Cf是最终计算产生的颜色,Cs是源颜色,Cd则是目标颜色,S和D分别是源和目标混合因子。这写混合因子是用下面函数进行设置。

void glBlendFunc (GLenum S, GLenum D);

S和D都是枚举值,而不是可以直接指定的实际值。 下图列出了混合函数可以使用的值。其中下标表示源、目标和颜色。R、G、B和A分别代表红、绿、蓝和alpha。

我们通过一个常见的混合颜色组合来举例说名。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这个函数告诉OpenGL接受源源颜色并将这个颜色(RGB值)与alpha值相乘,然后把这个结果加上目标颜色乘以“1减去源颜色的alpha值”的结果。
这个混合函数经常用于实现在其他一些不透明的物体前面绘制一个透明物体的效果。但是,这种技巧需要首先绘制一个或多个背景物体,然后再在上面绘制经过混合的透明物体。

改变混方程式

上面提及的混合方程式是默认的。实际上我们可以从五种不同的混合方程式进行选择,如下图所示,我们可以通过下面函数进行选择。

 void glBlendEquation(GLenum mode);    

示例演示

设置颜色混合。将颜色RGB(1.0,1.0,0.0)和50%透明效果的纹理绘制立方体。

void MyQGLWidget::initializeGL()
{loadGLTextures();glEnable(GL_TEXTURE_2D);glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清除屏幕所用的颜色glShadeModel(GL_SMOOTH);   // 平滑方式,这也是默认方式glClearDepth(1.0);//设置深度缓存glEnable(GL_DEPTH_TEST);  // 启用深度测试glDepthFunc(GL_LEQUAL);  //设置深度测试类型glEnable(GL_BLEND);                         //开启混合glDisable(GL_DEPTH_TEST);                   //关闭深度测试glColor4f(1.0f, 1.0f, 0.0f, 0.5f);                  //50%Alpha混合glBlendFunc(GL_SRC_ALPHA, GL_ONE);                  //基于源像素alpah通道值得半透明混合函数
}

运行结果:

代码下载
OpenGL学习系列导航

8.OpenGL学习之颜色混合相关推荐

  1. OpenGL学习(一)OpenGL基本介绍

    1. OpenGL基本介绍 1.1 OpenGL是什么?   当你第一次听到OpenGL时,你可能并不知道它到底是什么,但你应该知道它是与图形联系起来,这确实是OpenGL能够做的事情.OpenGL不 ...

  2. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  3. OpenGL学习之路17---- 镜面反射光

    代码放在github上 根据教程:ogldev一步步开始,记录学习历程 之前完成环境光和漫射光的学习.环境光的计算只由光强来决定,场景中所有位置是同一亮度:漫射光的计算由光强和光的方向一同决定,相关博 ...

  4. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

  5. 【我的OpenGL学习进阶之旅】介绍一下 绘制图元

    目录 一.绘制图元 1.1 `glDrawArrays` 1.1.1 `glDrawArrays`API说明 1.1.2 `glDrawArrays`API示例 1.2 `glDrawElements ...

  6. OpenGL学习-球体和phong光照模型

    OpenGL学习-球体和phong光照模型 开发环境搭建参考:https://lexiaoyuan.blog.csdn.net/article/details/120059213 通用配置步骤 Vis ...

  7. 【我的OpenGL学习进阶之旅】C++如何加载TGA文件?

    一.TGA文件相关介绍 通过前面的博客 [我的OpenGL学习进阶之旅]什么是TGA文件以及如何打开TGA文件? 地址:https://ouyangpeng.blog.csdn.net/article ...

  8. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7866 ...

  9. OpenGL学习(九)阴影映射(shadowMapping)

    目录 写在前面 阴影映射原理简介 封装 Camera 类 帧缓冲 阴影映射 准备工作 创建帧缓冲与深度纹理附件 从光源方向进行渲染 正常地渲染场景 如何查找bug(⚠重要) 多纹理传送 查看深度纹理数 ...

最新文章

  1. H3C Boot升级 Serial模式
  2. flux服务器推消息,在Spring WebFlux响应式处理程序中发送JMS消息:它是否阻塞?
  3. 关于求职简历的碎碎念。
  4. 互联网晚报 | 8月28日 星期六 | 我国网民规模超10亿;vivo首款自研影像芯片下月首发;同程艺龙拟改名为同程旅行...
  5. SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length
  6. Nginx解决403 forbidden
  7. 在OS上kill掉v$session中status值为killed的进程
  8. 毕设:基于Spring Boot的旅游攻略网的设计与实现
  9. 2021年PTCMS4.3最新采集规则13条
  10. 改进YOLOv7系列:23.YOLOv7添加CBAM注意力机制
  11. html tbody接收数据,html tbody标签怎么用
  12. Java虚拟机 - JVM是什么?
  13. winscp是什么软件_文件传输软件WinSCP的使用
  14. NodeJS 基础 API
  15. 长径比4.0金纳米棒直径4.2nm|长径比3.4金纳米棒直径10nm 长度34nm|长径比3.9金纳米棒直径10nm 长度39nm
  16. 聚创卓跃:拼多多店铺的平台规则
  17. 模拟器提示关闭 hyper-V,但 hyper-V实际上并没有开启
  18. 海量数据处理常用思路和方法
  19. 【钉钉-场景化能力包】考勤排班
  20. 使用 Spring 2.5 TestContext 测试框架

热门文章

  1. Android手机4G网络设置ipv6
  2. linux下汇编语言开发
  3. 直播怎么录屏,这3种录屏幕视频方法快收藏
  4. redis cluster slots数量 为何是16384(2的14次方)
  5. 什么是Native方法
  6. 为什么安装step7时要重启计算机,Step7 安装总是重启的解决办法
  7. 用UE进行ftp连接不成功
  8. MySQL 数据库 模糊查询和聚合函数
  9. calendar 日历事件 获取最近日程
  10. matlab生成word模板