入门图形学:光照模型(一)

Source
转载自: https://blog.csdn.net/yinhun2012/article/details/80654923


之前我们了解了渲染管线的流程,基本上知道了一个图形是如何从一串串二进制数据最终变成显示器上的图案的,但是其中一个很重要的过程我们并没有详细讲解,就是光照的过程。

        前面在图形学原理(三)中讲到了原材料“顶点”包括位置关、表面颜色、反射颜色、一个或多个纹理坐标集和一个法向量等属性,其中表面颜色和反射颜色是怎么来的呢?不仅仅依靠人为决定,同时也依靠模拟光源照射在物体上的物理过程。我们在真实世界中能看到五光十色的物体,就是太阳光和物体相互作用影响产生的效果,假如到晚上太阳落山并且没有月亮反射太阳光同时又停电了,那么世界在我们眼中就一片漆黑了。所以说光照处理过程决定了整个场景的绚丽美观程度,在计算机图形引擎中,光照的处理被抽象化成众多的数学公式模型,其中比较常见的依次有(排序方式依据推出的时间从先到后,运行得到的效果从简陋虚假到复杂真实,当然运算效率肯定是从高到低了):

        1.Phong光照模型

            

        2.Anisotropic光照模型

            

        3.Fresnel光照模型

            

        4.Blinn光照模型

            

        图片百度找的可能不准确,但是没关系,后面我们要一个一个仔细推导其背后的数学公式,然后在图形引擎中实现,就能看到具体效果了。

        过去的固定功能图形流水线被限制只能使用一个光照模型,被称为固定光照模型,当然也就是我们排序的第一个phong光照模型了,因为其数学计算最少,运行效率高,在老式的图形卡中跑得起来,虽然效果最差,当然这个phong光照模型会经过一些调整和增强,如增加输入参数等,也足够用来调整和控制物体的外观表现了,只是效果不那么真实。

        现在的可编程图形卡就比较高级了,都能支持cg编程语言,我们基本上都可以自己指定运行的光照模型数学公式,上面那四种是比较通用的光照模型,但其实很多图形引擎都有一套自己的调优光照模型公式,实现的效果可以非常真实且运行效率比较不错,比如寒霜引擎和顽皮狗游戏引擎,这些inhouse引擎基本都是自己实现的高效高真实感光照,甚至有局部高效光线追踪效果(光线追踪效果后面再详细学习)。

        比较常见的通用图形API(dx&opengl&vulkan)都提供了一些基本的光照模型模板,在这些光照模型里,一个物体的表面颜色是放射(emissive)、环境反射(ambient)、漫反射(diffuse)、镜面反射(specular)等光照作用的加成总和,同时每种光照作用取决于表面材质的性质(比例亮度和材质本身颜色)和光源的性质(例如光的颜色和位置)的共同作用。我们用一个包含红、绿、蓝三原色的float3的float数组(也可称向量)来表示每种光照作用。

        光照作用最终表面颜色公式:

        surfaceColor = emissive + ambient + diffuse + specular;

        这其中的每个分量我们下篇继续一一学习。

        

        

之前我们了解了渲染管线的流程,基本上知道了一个图形是如何从一串串二进制数据最终变成显示器上的图案的,但是其中一个很重要的过程我们并没有详细讲解,就是光照的过程。

        前面在图形学原理(三)中讲到了原材料“顶点”包括位置关、表面颜色、反射颜色、一个或多个纹理坐标集和一个法向量等属性,其中表面颜色和反射颜色是怎么来的呢?不仅仅依靠人为决定,同时也依靠模拟光源照射在物体上的物理过程。我们在真实世界中能看到五光十色的物体,就是太阳光和物体相互作用影响产生的效果,假如到晚上太阳落山并且没有月亮反射太阳光同时又停电了,那么世界在我们眼中就一片漆黑了。所以说光照处理过程决定了整个场景的绚丽美观程度,在计算机图形引擎中,光照的处理被抽象化成众多的数学公式模型,其中比较常见的依次有(排序方式依据推出的时间从先到后,运行得到的效果从简陋虚假到复杂真实,当然运算效率肯定是从高到低了):

        1.Phong光照模型

            

        2.Anisotropic光照模型

            

        3.Fresnel光照模型

            

        4.Blinn光照模型

            

        图片百度找的可能不准确,但是没关系,后面我们要一个一个仔细推导其背后的数学公式,然后在图形引擎中实现,就能看到具体效果了。

        过去的固定功能图形流水线被限制只能使用一个光照模型,被称为固定光照模型,当然也就是我们排序的第一个phong光照模型了,因为其数学计算最少,运行效率高,在老式的图形卡中跑得起来,虽然效果最差,当然这个phong光照模型会经过一些调整和增强,如增加输入参数等,也足够用来调整和控制物体的外观表现了,只是效果不那么真实。

        现在的可编程图形卡就比较高级了,都能支持cg编程语言,我们基本上都可以自己指定运行的光照模型数学公式,上面那四种是比较通用的光照模型,但其实很多图形引擎都有一套自己的调优光照模型公式,实现的效果可以非常真实且运行效率比较不错,比如寒霜引擎和顽皮狗游戏引擎,这些inhouse引擎基本都是自己实现的高效高真实感光照,甚至有局部高效光线追踪效果(光线追踪效果后面再详细学习)。

        比较常见的通用图形API(dx&opengl&vulkan)都提供了一些基本的光照模型模板,在这些光照模型里,一个物体的表面颜色是放射(emissive)、环境反射(ambient)、漫反射(diffuse)、镜面反射(specular)等光照作用的加成总和,同时每种光照作用取决于表面材质的性质(比例亮度和材质本身颜色)和光源的性质(例如光的颜色和位置)的共同作用。我们用一个包含红、绿、蓝三原色的float3的float数组(也可称向量)来表示每种光照作用。

        光照作用最终表面颜色公式:

        surfaceColor = emissive + ambient + diffuse + specular;

        这其中的每个分量我们下篇继续一一学习。