光照模型主要分为三类:测量模型,经验模型和基于物理的分析模型。
这里主要介绍光照模型为经验模型的Phong光照模型和Blinn-Phong光照模型。
内容主要参考 LearnOpenGL 《OpenGL编程指南》《Unity Shader入门精要》(想要pdf的同学可以评论或者私我)以及网上各种帖子。
标准光照模型
在1975年,裴祥风(Bui Tuong Phong)提出了标准光照模型背后的基本理念。标准光照模型只关心直接光照(direct light)。
它的基本方法,把进入到摄像机内的光线分为四个部分,每个部分使用一种方法来计算它的贡献度。这四个部分是:
自发光(emssive)
这个部分用来描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。
(辐射量,在实时渲染中,我们通常把光源当成一个没有体积的点,用l来表示它的方向,在光学中,用辐射量(irradiance)来量化光)
(全局光照,光通常都不是来自于同一个光源,而是来自于我们周围分散的很多光源,即使它们可能并不是那么显而易见。光的一个属性是,它可以向很多方向发散并反弹,从而能够到达不是非常直接临近的点。所以,光能够在其它的表面上反射,对一个物体产生间接的影响。考虑到这种情况的算法叫做全局照明(Global Illumination)算法,但是这种算法既开销高昂又极其复杂。)
(环境光照,opengl的实现中,我们将会先使用一个简化的全局照明模型,即环境光照。我们使用一个很小的常量(光照)颜色,添加到物体片段的最终颜色中,这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光。)
高光反射(specular)
也叫镜面反射,这个部分用来描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
漫反射(diffuse)
这个部分用来描述,当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
环境光(ambient)
用来描述其他所有的间接光照。
OpenGL中的实现
有事,日后再补。
浅记一下 bling-phong模型有个问题,做离线渲染的时候能量不守恒,导致内部比外部更亮(games104-5);
shadow map有个问题 从光源这边形成的一个shadow map,它的采样率和从相机这边看过去的采样率是不一样的。