OpenGL中环境光、漫反射、镜面反射对光的影响(如何被抽象成向量进行着色的)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyh930929/article/details/83418396

Phong着色算法将模拟光对模型中每个顶点的影响。所以这个算法没法考虑阴影,它只会计算应用于每个顶点的光线,而不考虑顶点是否位于阻挡光线的物体后面。但是,正因为如此,这是一种非常简单快速的算法,可以提供非常好的效果。

关于光的种类可以参考这篇文章OpenGL的环境光、点光源、聚光灯、方向光、材质的定义,本文主要介绍点光源、聚光灯、方向光在Phong算法下物体的效果。

Phong算法中影响光照的三个因素

  • 环境光(Ambient):可以理解为现实中的白天的室内,白天在室内我们能看的见物体,但是并没有感知光线的方向,其实是因为太阳离我们太远了,导致我们周围的光线强度都是一样的。
  • 漫反射(Diffuse):面向光源的表面更亮。
  • 镜面反射(Specular):模拟光在抛光或金属表面的反射

其实最终我们就是要计算出一个影响颜色的因子,在执行片段着色器程序时用这个变量fragColor去乘以该因子,进而根据接收的光线将颜色设置得更亮或更暗。将场景中对其他光的影响因素环境光、漫反射、镜面反射分别叫做A、D、S,则计算那个影响颜色的因子可以用下面公式来表示。

  • 如果模型没有纹理,将按照下面这个公式去算:
    在这里插入图片描述
  • 有纹理,将按照下面这个公式去算:
    在这里插入图片描述

环境光(Ambient)对光线的影响

它只是一个常数因素,可以使我们所有的物体更亮或更暗。环境光是最容易计算一种影响因素。我们只需要传递一种颜色,用它乘以模型的基色,它只是调制基色。所以我们只需要一个矢量来调制环境光强度和颜色。

漫反射(Diffuse)对光的影响

以点光源为例:假设有一个光源照在一个物体上,面向光源的一面整体会比背向光源的一面更亮。

在这里插入图片描述

对于漫反射的计算,首先在上图中的物体上取几个顶点位置P1、P2、P3,相应的顶点法向量为N1、N2、N3。顶点法向量是垂直于每个点的切平面的矢量。如下:

在这里插入图片描述

在上图中可以很明显的看出来,P1位置一定比P2更亮,P3基本不会受到该光源的影响。而P1位置比P2更亮是因为,P1受到的光照是从该顶点的正上方照射过来的,而P2受到的光线是比正上方稍微偏了一些。所以我们在计算每个顶点的漫反射影响因子时,顶点的法向量与该点受到光线的夹角是影响明暗的一个因素。

现在我们列出计算漫反射的已知参数:

  • vPos: 顶点坐标
  • lPos:灯的坐标
  • intensity:光线的强度 (范围是 0 to 1).
  • lColour:光的颜色
  • normal:顶点法向量

在这里插入图片描述

1、每个顶点受到的光照方向
在这里插入图片描述

2、每个顶点受到的光线强度:这里用顶点的法向量点乘光的方向,作为光线强度的影响因子,在两个向量夹角在0-90度之间时,夹角越大,点乘值越大。
在这里插入图片描述
3、每个顶点的颜色如下:diffuseColour指的是,如果没有纹理,该物体在漫反射下的颜色,可以理解为定义的物体的颜色。

在这里插入图片描述

如果是放方向光(DirectionalLight),那么直略过第一步的计算灯光方向,其余过程都是一致的。

镜面反射(Specular)对光的影响

当光线照射到表面时,它的某些部分被吸收而另一部分被反射,反射就是光线从物体上反射回来。镜面反射如下:

在这里插入图片描述

将空间中的观察点,比作相机(Camera)对于镜面反射,最重要的是要注意,只有当相机处于适当的位置时,反射光才会可见。例如,如果相机位于反射光发射的区域,光线才会可见。是否可见如下:

在这里插入图片描述

计算镜面反射光的流程:

1、首先求与入射光方向相反的向量
在这里插入图片描述

2、利用着色器的内置函数来计算反射光向量reflect(x,y)函数的是求x向量关于y向量的对称向量。
在这里插入图片描述

3、计算镜面反射光的强度cameraDirection是相机的方向向量。
在这里插入图片描述

在这里插入图片描述

4、当反射光直面相机的方向时,需要将反射光的强度加强。
在这里插入图片描述

5、最终的镜面反射光如下:specularColour指的是,如果没有纹理,该物体在镜面反射下的颜色,可以理解为定义的物体的颜色。
在这里插入图片描述

衰减(Attenuation)

上面已经模拟了在环境光下,漫反射和镜面反射对点光源的影响。但是到此位置光模型仍然不完整,物体反射的光与光的距离是有关的,我们需要模拟光的衰减。
在这里插入图片描述
上面公式中dist表示光源到顶点的距离,atConstantatLinearatExponent表示三个调整参数,其实就将我们可以调整的参数范围变得更大更详细了。

注意:只有点光源、聚光灯才需要考虑衰减。方向光是不用考虑衰减的。

猜你喜欢

转载自blog.csdn.net/xyh930929/article/details/83418396