LearnOpenGL-P9 创建Phong模型基础光照

0 上一章我们创建了一个FPS游戏风格的镜头调度。本期我们将根据Phong光照模型进行光照系统的模拟。
(1)创建光源和被光照射的物体。
(2)根据Phong模型进行光照系统的模拟。

1 创建光源和被光照射的物体。
1.0 我们让光源和被照对象共用一个VBO,使用同一个VBO中立方体顶点坐标进行图形绘制。把光源的VAO和被照对象的VAO分开设置。

1.1 创建两个着色器程序,一个是被照对象的着色器一个是光源的着色器。其中顶点着色器源码公用。光源的片段着色器源码将光源颜色设置为白色(即RGBA值均为1.0)。被照对象的颜色设置为对象自身颜色乘以光照颜色。




1.2 激活被照对象着色器程序,并设置好被照对象的颜色和光照的颜色。计算10个被照对象的MVP矩阵。激活被照对象的VAO,绘制被照对象实体。

1.3 确定光源在世界坐标系中的位置。激活光源着色器,设置好光源的MVP矩阵。绑定光源的VAO并绘制光源实体。


1.4 编译运行程序可得光源(白色)和10个被照对象(珊瑚色)。


2 根据Phong模型进行光照系统的模拟。
2.0 首先我们使用vertices数组传入顶点坐标的同时还要再传入每个顶点坐标的法向量。一个立方体有6个面,意味着顶点坐标的法向量有6种,分别指向立方体局部坐标系轴的6个方向。

2.1 将使用模型矩阵将顶点坐标从局部坐标系转到世界坐标系中供片段着色器使用。除了计算顶点之外,我们还需要使用法线矩阵将顶点法向量也转到世界坐标系中供片段着色器使用。

2.2 根据Phong模型的理论,我们将被照物体的光线信息拆分为三个部分:环境光(Ambient Lighting)、漫反射光(Diffuse Lighting)和镜面光照(Specular Lighting)。光源的光会根据这三个途径对物体产生相应的作用。三种光照RGB向量之和再乘以被照物体本身的RGB颜色向量即为通过Phong得到的光照信息。
(1)环境光照方面,我们设置了一个环境光强度系数用其影响环境光的强度。
(2)漫反射光方面,主要是要计算光源距离片段坐标的向量方向与片段自己的法向量之间的角度,角度越小,影响越大。
(3)镜面光照方面,我们主要是要考虑光源通过物体表面产生的反射光与观察者位置之间的关系,观察方向与反射光线的夹角越小,说明反射的光线强度越大。


2.3 我们可以让光源的位置有规律的移动起来。

2.4 激活光源着色器,传入光源的相关信息,再绑定光源的VAO对象即可绘制光源。

2.5 激活被照对象着色器,将被照对象的相关信息传入,绑定被照对象的VAO。再绘制每一个被照对象时,记得要把对象相应的法线矩阵传进去。


2.6 编译运行对象,可得到10个被照物体正对着光源,光源有规律的运动着。被照物体上的光线和颜色渲染会随着光源的移动而产生变化。此效果模拟现实中的光照现象。

2.7 我们也可以把光源固定住,让被照对象自己动起来。此时我们可以看到朝着光源的面更亮,背对光源的面更暗。


