
模拟真实光照环境来生成一张图像,需要考虑三种物理现象
辐照度(irradiance): 垂直于I的单位面积上单位事件穿过的能量
E(x) = dΦ(x) / dS E(x)表示辐射照度 Φ(x)表示辐射通量 S表示面积
一般来说,光照都不会和平面垂直,因此需要使用光源方向和表面法线之间的夹角余弦值得到照射面积
散射(scattering)和吸收(absorption)
散射只会改变光线的方向,而不改变光线的密度和颜色
吸收只会改变光线的密度和颜色,而不会改变光线的方向
折射(refraction)或透射(transmission)
光线在物体表面经过散射后,会散射到内部,称之为折射或投射
反射(reflection)
散射到外部,称之为反射
在折射进入物体内部的光线还会与内部颗粒进行相交,一些光线最后会重新发射出物体表面,而一些则被吸收
那些重新发射出去的光线将具有和入射光线不同方向分布和颜色
为了区分这两种不同的散射方向,在光照模型中使用不同的部分计算他们
着色shading。根据材质属性、光源信息,使用一个等式去计算沿某个观察方向的出射度的过程。这个灯饰也被称为光照模型(Lighting Model)
当已知光源位置和方向、视角方向时,我们就需要知道一个表面是如何和光照进行交互的
BRDF(Bidirectional refectance distribution function)包含了对给定模型表面上的一个点的外观的完整描述
在真实的光照情况下,一个物体也可能会被间接光照所照亮
光线也可以直接由光源进入摄像机。标准光照模型使用自发光来计算这个部分的贡献度。直接使用改材质的自发光颜色
漫反射光照用于对那些被物体表面随机散射到各个方向的辐射度进行建模。在漫反射中,视角的位置并不重要,可以认为在任何反射方向上的分布都是一样的。



漫反射 - 兰伯特模型
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));漫反射 - 半兰伯特模型
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb*(0.5*dot(worldNormal, worldLightDir) + 0.5); 高光反射 - Phong光照模型
fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));
fixed3 specilar = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);高光反射 - Blinn-phong模型
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
fixed3 halfDir = normalize(worldLightDir + viewDir);
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);