漫反射指的是粗糙的物体表面各个方向等强度地反射光,即等同的各个方向散射的现象
(图片源于Unity Shader 入门精要-冯乐乐著)
对于物体上的某一点,使用环境光源的情况下
A=K*I(环境光强)
其中A为漫反射物体与环境光交互反射的光强
K为漫反射物体材质的反射系数,取值范围为(0,1)
I1为环境光光强
因为环境光在物体各个点的强度相同,且没有方向因此上述Lambert公式中无需考虑光强的方向,但对于使用点光源就要考虑了
对于物体上的某一点,使用环境光源的情况下
A=K*I2*Cos(α)(点光源)
其中A为漫反射物体与环境光交互反射的光强
K为漫反射物体材质的反射系数,取值范围为(0,1)
I2为点光源光强
α为点光源向量与表面法向量的夹角
在Cg中,点光源向量为顶点指向光源的向量,并非普通情况下所指的从光源位置到顶点的向量,即:
(图片源于Unity Shader 入门精要-冯乐乐著)
如图所示,l为顶点指向光源的单位向量,n为顶点单位法向量,将向量表示为单位向量可以避免一些错误
因此A=K*I2*Cos(α)可以表示为A=K*I2*(n*l).
因为n*l=|n|*|l|*Cos(α)
而|n|=|l|=1
所以A=K*I2*Cos(α)等价于A=K*I2*(n*l)
对于|n|>1或|l|>1时
A=K*I2*Cos(α)等价于A=K*I2*(n*l)/(|n|*|l|)
对于漫反射模型来说,n,l,的数值并不是必须的,所以还是将其归一化会比较好,也可以避免一些额外的计算
因此,综合环境光和点光源计算得到最终的公式:A=K*I1+K*I2*(n*l) (n,l为单位向量)
附上源代码:
相关推荐