位置: 编程技术 - 正文

OpenGL进阶(十九) - 多光源(opengl示例)

编辑:rootadmin
从光说起

推荐整理分享OpenGL进阶(十九) - 多光源(opengl示例),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl,opengl gui,opengl详解,opengl入门教程(精),opengll,opengl入门教程(精),opengl入门教程(精),opengl入门教程(精),内容如对您有帮助,希望把文章链接给更多的朋友!

先看一段wiki中对光的定义

光是一种人类眼睛可以见的电磁波(可见光谱),视知觉就是对于光的知觉[1]。光只是电磁波谱上的某一段频谱,一般是定义为波长介于至纳米(nm)之间的电磁波,也就是波长比紫外线长,比红外线短的电磁波。有些资料来源定义的可见光的波长范围也有不同,较窄的有介于至纳米,较宽的有介于至纳米。光既是一种高频的电磁波,又是一种由称为光子的基本粒子组成的粒子流。因此光同时具有粒子性与波动性,或者说光具有“波粒二象性”。

按波动理论来解释,不同颜色的光就是不同波长的电磁波。

光的衰减(Attenuation)

任何点光源的光照亮度随着距离增加会迅速衰减。这个就叫光的衰减。

不同波长的光有不同的衰减方式,还有就是灯光所处的环境,比如是否有雾霾,下面是常见的几种衰减模型。

这里实现一个衰减的类,作为灯光的成员

Attenuation类有4个成员后面三项是常量项,线性项还有二次项,最后的衰减率的计算是由下面的公式确定的,Distance表示光源到点的距离。

attenuation = Constant + Linear * Distance + Quadratic * Distance ^ 2

第一个成员表示光源照亮的范围,下面有一个表可以用来查询四者之间的关系

当你选定了一个Rang的时候,你就可以找到对应的constant,linear 和 quadratic。

Constant 越趋近于0,灯光就越亮,反之越暗。

Linear越大,灯光衰减得就越快。不建议改变Quadratic值或者减少Linear的值,这样做需要重新计算Range.

减少Range值可以提升渲染的速度,但是减少得太多,在游戏中可能会造成灯光效果的突变。

点光源

首先创建一个BaseLight类,作为各种灯光的基类

注意,很多教程上光的属性有ambient,diffuse,specular之类,按照前面的原理,这都是不科学的,包括材质的Ambient,其实环境光应该是一个全局常量,所以材质也只能diffuse, specular. 插一段StackOverflow上的回答。

OpenGL进阶(十九) - 多光源(opengl示例)

这里基础 灯光只有三个成员,颜色,位置,强度。

点光源的类

灯光的初始化,So easy.

给shader传参数接下来就是shader了

vertex shader 就是传个值。

fragment shader也就是三板斧,ambient,diffuse,specular,具体计算看Code

运行结果

多光源

先看下最终的效果,是不是有点炫酷!?

整体的思路是:创建3个点光源,然后传到把点光源的信息都传递进去,开一个定时器,不断更新光源的位置,再更新shader数据,最后再绘制。

首先创建一个简单的场景类,注意这个类是要继承QObject的,因为要用到Qt的Signal/Slot机制。

接下来是cpp的实现

解释两个函数,

setUniform

向shader中传递当前灯光的参数。

updateLight

更新灯光的位置,不知道咋转的回去看线性代数。想偷懒的看这个 Real-Time Rendering (2) - 变换和矩阵(Transforms and Matrics)。

更新完之后调用setUniform传递参数。

最后看他们的初始化

Fragment Shader需要做一些改变

打完收工。

参考

Point Light Attenuation - lights - OpenGL – More Lighting: Ambient, Specular, Attenuation, Gamma - -

OpenGL ES2.0-iPhone开发-part1 原文链接地址:

OpenGL绘制Bezier曲线 项目要求:–使用鼠标在屏幕中任意设置控制点,并生成曲线–使用鼠标和键盘的交互操作实现对曲线的修改。项目总体介绍本项目利用Bezier曲线生成

OpenGL中的颜色混合功能(二)——抗锯齿的处理 OpenGL中的颜色混合功能(二)——抗锯齿的处理在OpenGL中,混合功能的另一个用途是抗锯齿的处理。在绝大多数情况下,一个渲染片段映射到计算机屏

标签: opengl示例

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

上一篇:OpenGL天空地形,场景漫游(opengl绘制地面)

下一篇:OpenGL ES2.0-iPhone开发-part1

  • 航天信息金税盘未打开
  • 税务师的含金量怎么样
  • 餐饮业厨房设备专票可以抵税吗
  • 厂家返点是什么意思
  • 如何做好存货管理,从哪方面去做
  • 以前年度损益对应的科目
  • 个人住房租赁给单位怎么交税
  • 税前利润等于应纳税所得额吗
  • 固定资产报废清理净损失属于什么费用
  • 金税盘服务费能抵税吗
  • 固定资产一次性折旧政策2023
  • 淘宝买货没有发票
  • 企业其他综合收益减少应该怎么处理
  • 搭赠的商品怎么开票
  • 融资租赁是怎么操作的
  • 有留抵税额的会计处理
  • 学校收到政府拨付的助学金和奖学金需要缴纳税款吗
  • 已认证发票退回的流程
  • 异地上班员工报销路费
  • 房屋租赁合同样本书
  • 发票选择确认平台怎么选
  • 办税员实名认证变更
  • 已经提完折旧的固定资产报废
  • 享受小微企业所得税优惠条件2022
  • 不开票收入是怎么回事
  • 当期免抵税额和当期留抵税额
  • 收到运费怎么做账
  • 待摊费用属于什么费用
  • 可变现净值是不是就是毛利
  • 未到期的商业票据是什么
  • 应收账款周转天数和应收账款周转率的关系
  • 企业补充流动资金具体用途
  • 确认坏账需要纳税调整吗
  • 无票业务如何处理
  • 建筑业销项税和进项税计算
  • 溢价购入债权投资是为啥
  • 什么叫经济作物和粮食作物
  • 国有企业上缴利润的账务处理怎么处理?
  • kb4592438安装失败
  • 应付债券的会计处理
  • uview2.0封装http请求实战以及常见请求传参实录
  • 年应税销售额包含哪些
  • 圆顶山遗址
  • html该怎么学
  • php 正则
  • vericut9.0环境变量
  • php消除警告
  • 增值税申报表期初未缴税额
  • 办公费用的核算方法
  • 什么叫预缴款
  • 应交税费月末怎么结转分录
  • 土方专用发票
  • 织梦安装详细教程
  • access2010宏操作大全
  • 常见的数据库管理系统有
  • 进项税大于销项税怎么抵扣
  • 营业执照办理税务登记需要什么资料
  • 收款预缴增值税怎么做账
  • 研发费用加计扣除政策指引2.0
  • 关于利润分配科目的表述正确的有
  • 针对收入未申报的问题
  • 建筑发票可以一次性抵扣吗
  • 技术合同免税备案税务局
  • win8.1资源管理器频繁假死
  • Win7安装i219v网卡驱动
  • WFXMOD32.EXE - WFXMOD32是什么进程
  • windows设置tomcat自动重启
  • windows查询
  • 安装win7系统后进不了系统
  • win8系统桌面图标怎么变小
  • xp无法启动如何修复
  • win7开机提示音在哪里关闭
  • 简单谈谈对电信的认识
  • 10个常用linux指令
  • Firefox window.close()的使用注意事项
  • jquery的设计模式
  • js 截取
  • easyui发送ajax请求
  • 在python中的用法
  • 企业所得税忘记计提了做到下个月可以吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设