位置: 编程技术 - 正文

OpenGL中的颜色混合功能(一)(opengl颜色代码表)

编辑:rootadmin
OpenGL中的颜色混合功能(一) 我们知道,材料属性和光照参数可以极大地增加图形的&#;真度,但除此之外,我们在对现实世界进行建模时,有许多效果是通过混合颜色的方式实现的。透明的物体,像是玻璃水杯,在它后面发射过来的光会与透明物体的颜色混合在一起。这种透明在OpenGL中的实现方式,是通过首先绘制背景物体,然后把前景物体(比如水杯)与颜色缓冲区中已经存在的颜色进行混合而实现的。在这一过程中,颜色的alpha&#;成分发挥了重要作用。 颜色的混合功能 在一般情况下,OpenGL在渲染时把颜色&#;存放在颜色缓冲区中,把每个片段(像素)的深度&#;存放在深度缓冲区中。当深度检测被关闭时,新的颜色&#;简单地覆盖颜色缓冲区中已经存在的颜色&#;;当深度检测被打开时,新的颜色&#;只有当它比原来的颜色更接近临近的裁剪平面时才会替换原来的颜色。当然,这是在OpenGL的混合功能被关闭的情况下。当混合功能被启用时,新的颜色会与颜色缓冲区中原有的颜色进行组合。通过对这些颜色进行不同的组合,可以产生许多种不同的效果。 在介绍颜色混合之前,我们需要首先明确目标颜色和源颜色这两个术语的概念。首先,已经存储在颜色缓冲区中的颜色称为目标颜色,这个颜色包含了单独的红、绿、蓝成分以及一个可选的alpha&#;。其次,作为当前渲染命令的结果进入颜色缓冲区中的颜色称为源颜色,它同样也包含了四种颜色成分(红、绿、蓝和可选的alpha&#;成分)。我们正是通过对目标颜色和源颜色进行不同的组合操作,来实现颜色混合的功能的。启用混合功能: glEnable(GL_BLEND); 当混合功能被启用时,源颜色和目标颜色的组合方式是由混合方程式来控制的。在默认情况下,使用的混合方程式如下所示: 其中,Cf是最终计算产生的颜色,Cs是源颜色,Cd是目标颜色。S是源混合因子,D是目标混合因子。这两个混合因子可以通过下面的这个函数进行设置: glBlendFunc(GLenum S, GLenum D); 可以看出,形参S和D都是枚举&#;,而不是可以直接指定的实际&#;。只谈概念有些模糊,让我们通过一个常见的混合函数示例来说明上述概念的实际应用: // 设置源混合因子和目标混合因子 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 根据上面的混合函数,如果颜色缓冲区中的目标颜色为红色(1.0f,0.0f, 0.0f, 0.0f);源颜色为一种蓝色(0.0f, 0.0f, 1.0, 0.6f),它的alpha&#;为0.6,那么计算得出的最终颜色为: Cd = 目标颜色 = (1.0f,0.0f, 0.0f, 0.0f) Cs = 源颜色 = (0.0f, 0.0f, 1.0, 0.6f) S = 源颜色alpha&#; = 0.6 D = 1 - 源颜色alpha&#; = 0.4 所以,根据混合方程式: 相当于:Cf = (蓝 * 0.6)&#; (红 * 0.4) 最终产生的颜色是目标颜色红色与源颜色蓝色进行缩放后的组合,并且源颜色的alpha&#;越高,添加的源颜色成分就越多,目标颜色所保留的成分就越少。这个混合函数经常用于在一些不透明的物体前面绘制透明物体的效果。这种技巧在实现时需要首先绘制背景物体,然后再绘制经过混合的透明物体。它的效果会令你惊讶,如图所示: 让我们通过代码,来看一下Reflection示例程序的制作思路: void RenderScene() { // 清空颜色缓冲区和深度缓冲区 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // ----------------------- 首先绘制地板下方的球体 -------------------- // 保存矩阵状态 glPushMatrix(); // 将光源0的位置摆放到地板下方 glLightfv(GL_LIGHT0, GL_POSITION, fLightPosMirror); // 保存矩阵状态 glPushMatrix(); // 设置顺时针环绕的一面为多边形的正面,对多边形进行镜像 glFrontFace(GL_CW); // 在Y轴使用-1的缩放因子来反转Y轴 glScalef(1.0f, -1.0f, 1.0f); // 绘制地板下方的球体 DrawSphere(); // 设置逆时针环绕的一面为多边形的正面 glFrontFace(GL_CCW); // 恢复矩阵状态 glPopMatrix(); // ----------------- 通过对地板设置透明的颜色混合效果,来实现反射的幻觉 ----------------- // 关闭光照计算 glDisable(GL_LIGHTING); // 打开颜色混合 glEnable(GL_BLEND); // 设置混合因子 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 绘制地板 DrawGround(); // 关闭颜色混合 glDisable(GL_BLEND); // 打开光照计算 glEnable(GL_LIGHTING); // -------------------- 最后绘制地板上方的球体 --------------------------- // 将光源0的位置摆放到地板上面 glLightfv(GL_LIGHT0, GL_POSITION, fLightPos); // 绘制地板上方的球体 DrawSphere(); // 恢复矩阵状态 glPopMatrix(); // 执行缓冲区的交换 glutSwapBuffers(); } 我们在进行场景的绘制时,首先以上下颠倒的方式,最先绘制地板下方的球体;然后打开混合,在球体的上面绘制一层透明的地板;最后恢复颠倒后的坐标系,绘制地板上方的球体。这三部分完成后,一幅地板反射球体的幻觉画面就完成了,如图所示: 这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下( 本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:

推荐整理分享OpenGL中的颜色混合功能(一)(opengl颜色代码表),希望有所帮助,仅作参考,欢迎阅读内容。

OpenGL中的颜色混合功能(一)(opengl颜色代码表)

文章相关热门搜索词:opengl颜色填充,opengl颜色混合出现彩色条纹,opengl颜色代码,opengl颜色代码表,opengl颜色混合模式,opengl颜色代码,opengl颜色混合出现彩色条纹,opengl颜色混合,内容如对您有帮助,希望把文章链接给更多的朋友!

windows visual studio 基于openGL的粒子系统设计 这是我上计算机三维动画的时候的期末作业,自己动手做的能实现粒子系统的效果,同时代码很简单,只有一个cpp文件,很适合想要理解粒子系统原理

windows visual studio openGL开发环境配置 1.到openGL官方网站去下载openGL的开发包,目录如下2.打开visualstudio创建win控制台程序3.打开项目的属性4.配置项目动态库路径5.配置openGL的lib的目录(其

Android OpenGL 学习笔记 --开始篇 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。

标签: opengl颜色代码表

本文链接地址:https://www.jiuchutong.com/biancheng/373147.html 转载请保留说明!

上一篇:[3D 图形学基础] 读书笔记(1) Part_I(Getting Started) - Introduction(3d图形学原理)

下一篇:windows visual studio 基于openGL的粒子系统设计

  • 增值税留存比例50
  • 增值税发票选择确认平台打不开怎么办?
  • 什么类型的电子商务
  • 进项税额不允许抵扣怎么计算
  • 营业成本和生产成本的公式
  • 改签费可以进项转出吗
  • 增值税冲红附加税费可以退吗
  • 购货方收到红字发票
  • 个人去税务局开专票需要提供什么
  • 存款利息缴纳个税
  • 工程结算可以转什么科目
  • 计提坏账又收回
  • 教育协会发的证有用吗
  • 两个单位同一个法人
  • 注销时留抵税额不能退怎么做分录
  • 外汇风险管理的贸易融资法
  • 股东借款利息代扣代缴增值税是怎样算的?
  • 代开发票有哪些问题需要知道的?
  • 小规模季度超了9万怎么报增值税
  • 房地产企业不可能没有合同台账
  • 进项抵扣抵扣
  • 出口退税换汇率多少是正常
  • 赊购商品一批
  • 资金印花税
  • 计提的利息收入交所得税吗
  • 合同负债和预收账款的关系
  • 怎么关闭win11安装软件提示
  • bios界面进入
  • php开发常用技术
  • 付员工经济补偿金计入工资总额吗
  • 生产和提供的区别
  • 工程投标保证金最新规定
  • 高德地图定位获取用户手机号码
  • 公司二手车转个人
  • mac安装wine教程
  • 不良贷款转让需遵循的原则
  • 利息保障倍数 资本化利息支出
  • 在途物资运费会计科目怎么写
  • 经营租出的设备要计提折旧吗
  • 解决跨域问题的注解
  • GPT-4 手画设计稿 直接生成前端页面
  • php中input的用法
  • 税控盘全额抵扣发票怎么勾选
  • 软件开发企业如何核算成本
  • dedecmsv6
  • 固定什么意思
  • 销售旧货的增值税是销项税吗
  • 分公司可以独立开票吗
  • PostgreSQL中调用存储过程并返回数据集实例
  • 收到退回的文化事业建设费会计分录
  • 逾龄资产对企业的影响
  • 出口退税如何做进料核销凭证
  • 企业管理理费包括哪些
  • 税审报告需要什么资料
  • 预借备用金的会计分录
  • 外币投资计入什么科目
  • 业务招待费可以结转下年抵扣吗
  • 利息专用发票可以抵扣吗
  • linux如何安装c语言编译器
  • 数据库中多表连接的方式
  • sql server2000个人版安装步骤
  • 如何查看windows密钥
  • windows个性化定制包含
  • centos6.5配置网络
  • xp系统如何加速
  • ubuntu不支持设置属性
  • bash.exe
  • win7系统如何配置ip地址
  • win7怎么打开磁盘管理器
  • android游戏开发 教程
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • python内置函数用来打开或创建文件并返回文件对象
  • jquery代码实现鼠标点击
  • jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
  • nodejs mysql orm
  • linux中的shell命令
  • jquery使用css
  • javascript中数组的方法
  • 怎么查询地方规划用地
  • 增值税专用发票注明的金额是含税还是不含税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设