图形学(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 \]

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 下的重心坐标进行插值即可。

纹理坐标和颜色同理。

posted @ 2023-03-16 23:13  Watware  阅读(71)  评论(0编辑  收藏  举报