一.基本概念
首先,对于基础光照Shader我们需要先学习光照相关的知识。
我们使用辐照度来量化光,假设顶点法线为normal,入射光线向量为light,二者夹角为a,辐照量与cos(a)的值成正比。
着色指的就是根据材质属性,光照信息等根据一个公式计算辐照度的过程。我们把计算辐照度的这个公式称作光照模型。
在我们的光照模型中,需要考虑如下四种光类型:
自发光:一个物体本身发光的辐射量。
高光反射:完全镜面反射散射的辐射量。
漫反射:不规则反射散射的辐射量。
环境光:描述其他所有的间接光照。
对于环境光与自发光的计算,我们均采用简单的等式计算(a为已知量):
x(ambient)= a(ambient)
x(emissive)= a(emissive)
对于漫反射的计算,我们采用兰伯特定律来计算,即反射光线的强度与 表面法线和光源方向之间夹角的余弦值 成正比。
x(diffuse)=a(light) * a(material) * max(0, n*l)
a(light)是光照信息,a(material)是材质信息。n*l是法线与光照方向点乘计算得到的,其中n与l都是单位矢量,这样就得到了余弦值。max(0, n*l)是因为辐照度不能为负,我们的计算中不存在负强度的光照。
对于高光反射的计算,我们有两种策略:
1.x(specular)=a(light) * a(specular) *( max(0, v * r) ^ gloss )
gloss是光泽度,反光度。gloss值越高,高光区域的亮点就越小。a(specular)是材质信息,a(light)是光照信息。v是视角方向,r是反射向量。
2.Blin-Phong模型:
x(specular)=a(light) * a(specular) *( max(0, n * h)^gloss)
其中n为法线方向单位矢量,h为((v+l)/ | v+l | )即v+l之后截取为单位矢量。
二.Shader实现
在下面的Shader中我们先不考虑自发光emissive,只考虑环境光ambient与漫反射光diffuse与高光反射sp