光照:
光照以不同的方式影响着我们看到的世界,有时甚至是以很戏剧化的方式。当手电筒照射在物体上时,我们希望物体朝向光线的一侧看起来更亮。我们所居住的地球上的点,在中午朝向太阳时候被照得很亮,但随着地球的自转,同一个地点的亮度会由白天到傍晚逐渐变暗,直到午夜变得完全黑暗。物体对光的反射情况也各不相同。物体除了可以具有颜色,也可以具有不同的反射特性。考虑两个物体,在都是绿色的情况下,其中一个是布制的,而另一个是抛光钢材质的——那么后者看起来会更“闪亮”。
光照模型:
我们观察到光,是由于高能量源发出的一些光子经过反射到达了我们的眼睛。不幸的是,在计算上模拟这个自然过程是不可行的,因为这需要模拟并跟踪大量光子的运动,即向我们的场景中添加海量的对象(和矩阵)。因此,我们需要的是光照模型。
我的理解:
把高能量源发出一些光子经过反射到达我们眼睛的这种现象,通过计算机模拟的方式展现在我们眼前。计算机怎末模拟? 通过模拟并跟踪大量光子的运动,即向我们的场景中添加海量的对象(和矩阵),这个模拟的过程就叫做光照模型。(用于模拟光照效果的算法,通过考虑光源、材质和几何体之间的相互作用来计算表面的颜色和明暗度)
常见的几种光照模型:
光照模型只是比较笼统的概念,而具体的展现形式或者是实现方式有哪些?
比如:
我要去某一个地方,怎末去?具体怎末到达, 我会说用交通工具(光照模型),
交通工具用哪一种?步行,自行车,开车(常见的几种光照模型)
-
ADS模型:(主要的模型)
它由三个部分组成:环境光照(Ambient),漫反射光照(Diffuse)和镜面光照(Specular) A:环境光反射(ambient reflection):模拟低级光照,影响场景中的所有物体。 D:漫反射(diffuse reflection):根据光线的入射角度调整物体亮度。 S:镜面反射(specular reflection):展示物体的光泽,通过在物体表面上,光线直接地反射到我们的眼睛的位置,策略性地放置适当大小的高光来实现。
-
简单光照模型(Simple Lighting Model):
这是一种基本的光照模型,通常只考虑漫反射光照,忽略环境光照和镜面光照。它适用于一些简单的场景或要求较低的应用。
-
Cook-Torrance模型:
这是一种基于微表面理论的光照模型,适用于模拟金属或光泽材质的光照效果。它考虑了更多的光线与微表面的相互作用,能够产生更真实的镜面高光效果。
-
Oren-Nayar模型:
这是一种用于模拟粗糙表面的光照模型。它考虑了表面的微小凹凸结构对光线的散射影响,能够产生更真实的漫反射光照效果。
ADS光照计算:
- 总计算流程:
vec3 result = (ambient + diffuse + specular);
- 环境光计算:
环境光(光源)与材质环境光(物体自身)分量的乘积
vec3 ambient = material.ambient * light.ambient;
- 漫反射计算:
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = (diff * material.diffuse) * light.diffuse;
- 镜面反射计算:
// specular
float specularStrength = 0.5;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = max(dot(viewDir, reflectDir), 0.0);
vec3 specular = (material.specular * spec) * light.specular;