OpenGL学习之Basic-Lighting

来源:互联网 发布:网络红人马浩东前女友 编辑:程序博客网 时间:2024/05/18 03:19

基本光照

现实世界中的光照非常复杂,依赖于很多我们在有限的处理能力下无法计算的太多的因素。openGL中的光照基于近似真实的易于处理的简单模型。这些光照模型是基于我们理解的物理光的。其中一个是Phong光照模型。它主要由3个部分构成:环境光、diffuse光和高光。下面,你会看到这几个光照部分
1. 环境光:虽然比较暗,但还是有(月光、远处灯),所以物体大部分不会全黑。为了模拟这个,我们用一个持续给物体光照的环境光常量。
2. 漫反射:模拟一个光照在物体上的直接影响。是光照模型最明显的部分。一个物体的某部分对着光源越多,越亮。
3. 高光:模拟光照的亮的聚光,高光颜色更接近于光的颜色而不是物体的颜色。

环境光

光一般不是来自于单独一个光源而是来自与许多分布在我们周围的光源,虽然他们不是立即可见的。光的属性之一是它可以向多个方向散射和反弹,到达一个离他很远的地方。将这个考虑在内的算法称为GI算法,这些算法比较复杂。
由于我们不是复杂和昂贵的算法的粉丝,我们将从一个全局光照的简单的模型开始,叫做环境光照。
将环境光照加到场景里非常简单,将光的颜色,乘以一个小的环境常量因子,再乘以物体的颜色,当作像素颜色。

void main(){    float ambientStrength = 0.1;    vec3 ambient = ambientStrength * lightColor;    vec3 result = ambient * objectColor;    FragColor = vec4(result, 1.0);} 

另一个事情

如果模型矩阵执行了一个不均衡的缩放,顶点变换后,法线向量不再正交于表面,所以我们不能用这样的模型矩阵变换法线向量。下面的图显示了这样一个模型矩阵对法线向量的影响:
这里写图片描述
无论何时我们用一个不均衡缩放(均衡缩放不会破坏法向量,因为他们的方向不会变,只是大小会变,可以通过normalize解决),法线向量不再垂直于相应的表面,导致光照的扭曲。
解决这个问题的方法是,用一个不同的为法线向量定制的模型矩阵。这个矩阵称为法线矩阵,用一些线性代数运算来消除不正确地缩放法线向量的影响。

这个法线矩阵定义为模型矩阵的坐上角的逆转置矩阵。一些资源定义的法线矩阵都是应用在model-view矩阵上的,而由于我们在世界空间下运算,所以我们只用model矩阵。

在顶点shader里,我们可以用逆运算和转置运算自动生成这个法线矩阵。然后把生成的这个矩阵转换成3*3矩阵,乘以法向量。如果说没有对物体本身进行缩放,就没有必要用法线矩阵,因为可以直接用model矩阵乘以法线向量。如果你进行不规则变换,必须要将你的法线向量乘以法线矩阵。

原创粉丝点击