opengl灯光基础:2.1 光照基础知识

光照:

光照以不同的方式影响着我们看到的世界,有时甚至是以很戏剧化的方式。当手电筒照射在物体上时,我们希望物体朝向光线的一侧看起来更亮。我们所居住的地球上的点,在中午朝向太阳时候被照得很亮,但随着地球的自转,同一个地点的亮度会由白天到傍晚逐渐变暗,直到午夜变得完全黑暗。物体对光的反射情况也各不相同。物体除了可以具有颜色,也可以具有不同的反射特性。考虑两个物体,在都是绿色的情况下,其中一个是布制的,而另一个是抛光钢材质的——那么后者看起来会更“闪亮”。

光照模型:

我们观察到光,是由于高能量源发出的一些光子经过反射到达了我们的眼睛。不幸的是,在计算上模拟这个自然过程是不可行的,因为这需要模拟并跟踪大量光子的运动,即向我们的场景中添加海量的对象(和矩阵)。因此,我们需要的是光照模型。

我的理解:
把高能量源发出一些光子经过反射到达我们眼睛的这种现象,通过计算机模拟的方式展现在我们眼前。计算机怎末模拟? 通过模拟并跟踪大量光子的运动,即向我们的场景中添加海量的对象(和矩阵),这个模拟的过程就叫做光照模型。(用于模拟光照效果的算法,通过考虑光源、材质和几何体之间的相互作用来计算表面的颜色和明暗度)

常见的几种光照模型:

光照模型只是比较笼统的概念,而具体的展现形式或者是实现方式有哪些?
比如:
    我要去某一个地方,怎末去?具体怎末到达, 我会说用交通工具(光照模型),
    交通工具用哪一种?步行,自行车,开车(常见的几种光照模型)
  • 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;
  • 镜面反射计算:
    在这里插入图片描述

ADS 光照模型的镜面反射指数为:1 (material.shininess = 1.0 )

	这也就和phong 的区别,ADS模型是phong光照模型的特例。
    // specular
    float specularStrength = 0.5;
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 reflectDir = reflect(-lightDir, norm);  
    // material.shininess = 1.0 ADS 光照模型的反射指数为:1
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
    vec3 specular = (material.specular * spec) * light.specular;  

镜面反射指数为1的效果:

opengl灯光基础:2.1 光照基础知识_第1张图片

镜面反射指数为64 的效果:

opengl灯光基础:2.1 光照基础知识_第2张图片

你可能感兴趣的:(OPENGL,opengl)