LearnOpenGL笔记6光照


现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色。
当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是我们所感知到的颜色)

创建一个光照场景

1、一个物体作为被投光(cast the light)的对象;一个物体代表光源在3D场景中的位置
2、一个顶点着色器绘制箱子,与之前的顶点着色器相比,容器顶点位置保持不变。
创建一个光源的立方体,所以为灯设置一个专门的VAO。
3、设置片段着色器,从uniform变量接受物体颜色和光源颜色。灯需要另外的一套着色器。为了显示真正的灯,将表示光源的立方体绘制在和光源相同的位置

基础光照

OpenGL使用的是简化模型光照,这些模型都是基于我们对于光的物理特性的理解。其中,一个模型被称为是冯氏光照模型。冯氏光照模型主要结构:环境、漫反射、镜面光照;
环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。
镜面光照(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。

环境光照

光能够在其它的表面上反射,对一个物体产生间接的影响。考虑到这种情况的算法叫做全局照明(Global Illumination)算法,但是这种算法既开销高昂又极其复杂。
我们将会先使用一个简化的全局照明模型,即环境光照。正如你在上一节所学到的,我们使用一个很小的常量(光照)颜色,添加到物体片段的最终颜色中,这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光。

漫反射光照

算漫反射光照需要什么?

法向量:一个垂直于顶点表面的向量。
定向的光线:作为光源的位置与片段的位置之间向量差的方向向量。为了计算这个光线,我们需要光的位置向量和片段的位置向量。

法向量

我们利用它周围的顶点来计算出这个顶点的表面。我们能够使用一个小技巧,使用叉乘对立方体所有的顶点计算法向量。
对灯的着色器使用不能完全利用的顶点数据,顶点数据从箱子对象载入后就储存在GPU内存,不需要储存新数据到GPU内存。
光照计算都是在片段着色器进行,将法向量由顶点着色器传递到片段着色器。

计算漫反射光照

对每个顶点都有了法向量,光源位置向量和片段位置向量。由于光源位置是一个静态变量,可以在片段着色器中声明为uniform;
在渲染循环中,更新uniform,前面声明lightpos向量作为光源位置;
还需要片段的位置,会在世界空间中进行所有的光照计算,所以我们需要一个在世界空间中的顶点位置。可以通过把顶点位置属性乘以模型矩阵变换到世界空间坐标。
所有的变量设置好了,片段着色器添加光照计算。
计算光源和片段位置之间的方向向量。光的方向向量是光源位置向量与片段位置向量之前。

last

法向量从顶点着色器传到了片段着色器,但是要转换到世界坐标系,方法:
1、法向量只是一个方向向量,不能表达空间中特定位置。

镜面光照

其实这个章节想要很好的理解对应的原理,还是应该先去看看计算机图形学课的,那个地方讲的比较好,仔细。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值