位置: 编程技术 - 正文
推荐整理分享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上的回答。这里基础 灯光只有三个成员,颜色,位置,强度。
点光源的类
灯光的初始化,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 转载请保留说明!友情链接: 武汉网站建设