文章目录
(23.3.16今天重新捡起知识,从phong开始复习)
reference:
learn opengl
《unityshader入门精要》
结构
注意本文所有的公式都是光线强度,不能直接用到shader中,因为还需要反射颜色的计算
为了更好的记住,将两种光照结合对比记忆
phong 光照由三部分构成,如图
Ambient 环境光
略
Diffuse 漫反射光
漫反射光与视线无关,仅与光线和表面法线有关,因此其结果像是一张贴图
漫反射的作用仅是根据入射角度来计算削弱光线强度,仅此而已:
C = − L ⋅ N C = -L·N C=−L⋅N
L为光线向量,N为法线向量
diff = max(dot(norm, lightDir), 0.0)
(max函数将点积限制在 [0, 1],大于90度是照不到的,同时也避免了负数出现)
即,漫反射强度与LN的余弦值成正比
Specular 高光
Phong
高光,仅关乎到两个向量:视线方向和反射方向(但是反射向量也要计算得来)
如图,看似很多向量,真正需要的只有两个,V和R,不过为了实现高亮的光斑(一小块),我们需要一个指数运算:
C = ( V ⋅ R ) g C = (V·R)^{g} C=(V⋅R)g
- V是视线向量,R是反射向量,g是高光系数gloss/shininess(越大越集中)
- 实际上这个公式也是phong的高光分布,当粗糙度g为1时,其衰减曲线就是个cos函数 [ 0 ,