图形学(3)Shading
前言
Shading 计算物体接收到的光照,并得到物体的颜色,Shading 不计算阴影。这里介绍最简单的 Blinn-Phong Reflection Model。
Blinn-Phong Model
Blinn-Phong Reflection Model 是一个经验模型,不完全符合真实光照,但是他真的很简单 XD。它将进入摄像机的光照分成三部分:环境光(Ambient)、漫反射(Diffuse)、高光反射(Specular)
环境光 Ambient
我们假设所有环境光相等,记为 \(I_a\),记 \(k_a\) 为环境光下物体的颜色,有
\[L_a=k_aI_a
\]
漫反射 Diffuse
\[L_d=k_d(I/r^2)max(0,\mathbf n\cdot\mathbf l)
\]
其中 \(k_d\) 是漫反射下物体的颜色,\(I\) 与光源大小有关,\(\mathbf l\) 为光源方向,\(\mathbf n\) 为法线方向,\(|\mathbf n|=|\mathbf l|=1\)。
高光 Specular
记半程向量 \(h=\displaystyle\frac{\mathbf v + \mathbf l}{\Vert \mathbf v + \mathbf l\Vert}\),用半程向量和法向量的夹角衰减一下,有
\[L_s=k_s(I/r^2)\max(0,\mathbf n\cdot\mathbf h)^p
\]
![](https://img2023.cnblogs.com/blog/2878790/202304/2878790-20230403212540963-631800969.jpg)
Anyway,跑出来的图至少看起来像是一张像模像样的素描 XD
相关量的插值
View Space Position
考虑将屏幕空间的 \(xy\) 坐标和插值得到的 \(z\) 坐标做 Viewport,Projection 变换的逆变换得到 View Space 的坐标。
Normal Vector of Vertex
- 如果知道原始的图形,直接计算出原始图形在顶点处的法线即可
- 否则考虑用顶点周围三角形的法线计算:
\[N_v=\frac{\sum_i N_i}{\Vert\sum_i N_i\Vert}
\]
可以选取适当的权值(例如三角形面积)进行加权平均,可以得到更好的结果。
Normal Vector of Pixel
按照顶点的法向量和 Viewport Space 下的重心坐标进行插值即可。
纹理坐标和颜色同理。