对于漫反射:
diffuse = 光照颜色*材质漫反射颜色*max( 0, cos( 点到光源方向与法线夹角 ) )
注:对于一般的纹理来说,材质漫反射颜色就是纹理采样颜色
这里主要需要求出的是点到光源方向,并且在这里点到光源方向是在世界空间下的。
求解说明:
1. UnityWorldSpaceLightDir( float4 worldPos )函数接收一个世界空间下的位置返回一个该位置到光源的世界空间下向量。因此要求解世界空间下顶点到光源的向量需要先求出顶点的世界空间下位置。
2. 顶点在世界空间下位置计算公式:float4 worldPos = mul( _Object2World, v.vertex )
对于高光发射:
Phong 模型:
specular = 光照颜色*材质高光反射颜色*max( 0, cos(视角方向与反射方向夹角) )^Gloss
Blinn Phong模型:
specular = 光照颜色*材质高光反射颜色*max( 0, 法线*h向量 )^Gloss
这里的h向量 = normarlize( 视角方向 + 光照方向 )
因此对于phong模型主要求出视角方向与反射方向夹角,也就是视角方向与反射方向
对于Phong模型主要求出角视方向与光照方向。
世界空间下光照方向在漫反射部分已经说明。
世界空间下光照反射方向:
1.normarlize( reflect( -世界空间下光源方向, 顶点世界空间下的法线 ) )
2.normarlize( UnityWorldSpaceLightDir( 世界空间下顶点位置 ) )
世界空间下视角方向:
1.normarlize( 世界空间下照相机位置 - 世界空间下顶点位置 )
2.normarlize( UnityWorldSpaceViewDir( 世界空间下顶点位置 ) )