跟着闫令琪老师的课程学习,总结自己学习到的知识点
光栅化
着色(Shading)
在图形学中,着色的定义可以为:对物体(模型)应用某种材质。
主要是通过光照以及着色点参数进行表现。
在我们感知观察中,光线可以分为:高光、漫反射、环境光。
下面介绍一种简单的模型,对各种光照模型进行研究。
Bling-Phong Reflection Model
Phong反射模型
下图是光线照射到着色点上的示意图,为了便于分析,我们假设光线是从着色点方向发出。
Diffuse Reflection(漫反射)
漫反射: 当Phong模型表面是粗糙材质时,光照射到着色点时,会发生均匀反射,并且反射的光线的光强都相同。
那么每个入射的光线实际上照射到着色点的光强该怎么算。看下面的模型,首先光线与法线 n n n的夹角 θ \theta θ有关, cos ( θ ) = l ⃗ ⋅ n ⃗ \cos(\theta)=\vec{l}\cdot \vec{n} cos(θ)=l⋅n, ( l ⃗ 、 n ⃗ ) (\vec{l} 、\vec{n}) (l、n)为单位向量。
其次,图中中心为一个点光源,光线均匀的向周围发射,可以想象光源发射出来的能量其实是一定的,那么在任意两个圈上接受到的能量一定相等。而离圆心越远,圆的面积越大,单位面积所接受能量也就越弱。半径 r r r上的一点接收的能量为 I r 2 \frac{I}{r^2} r2I.
所以Diffuse Reflection可以用下面的式子表示
可以看出光强 L d L_d Ld与着色点表面参数 k d k_d kd、入射角 m a x ( 0 , n ⃗ ⋅ l ⃗ ) max(0,\vec{n} \cdot \vec{l}) max(0,n⋅l)、入射时的光强 I r 2 \frac{I}{r^2} r2I有关。
[Notes]: 入射角 m a x ( 0 , n ⃗ ⋅ l ⃗ ) max(0,\vec{n} \cdot \vec{l}) max(0,n⋅l) 最小为0。
下图反应了着色点的表面参数对Diffuse Reflection的影响。
Specular HighLight(高光)
高光发生的反射实际上是镜面反射,所以反射光线的范围很小。所以想要表示Specular Trem,需要表示反射光线与视点观测线之间的远近。
表示反射光线与视点观测线之间远近我们可以转化为求法线 n ⃗ \vec{n} n与半程向量 h ⃗ \vec{h} h之间的距离的远近。Specture Term也可以表示如下,仔细与Diffuse Term比较发现,Specture Term的相邻角是 m a x ( 0 , cos α ) p max(0,\cos \alpha)^p max(0,cosα)p,多了个指数。原因【图2】,镜面反射的范围通常小,所以增加指数,这样,可以很好模拟镜面反射范围小。
Ambient Term
环境光比较特殊、只有着色点表面因素的影响。
Blinn-Phong Reflection Model Term
基于以上三个式子,Bling-Phong模型的光照模型就可以表述出来了。
着色频率
前面我们知道了局部光照模型等式,但想要计算整个模型的光照模型,还需要知道每个模型上着色点的分布,引出了着色频率的概念。着色频率分为以下三种:Flat Shading、Gouraud Shading、Phong Shading,分别对应着三角形面着色、三角形顶点着色、每个点着色,以下是三种着色频率的效果。
Flat Shading(Shading each triangle)
在每个三角形的面上着色,对应着Flat Shading。每个三角形面的面法线只有一个,所以可以利用光照模型等式直接进行计算。这种着色效果是一个三角形面里的颜色一样,所以着色效果不平滑。
Gouraud Shading(Shading each vertex)
对每个三角形的顶点进行着色、对每个三角形面中间的颜色进性插值。Gouraud Shading着色有两个主要问题:
1 顶点着色时的法线怎么计算
2 怎样对三角形进行插值
顶点法线
1 最好的方法是对顶点的外接圆,然后找到对应点外接圆的法线即可。
2 平均每个顶点相接的面法线。
N v = ∑ i N i ∣ ∣ ∑ i N i ∣ ∣ N_v=\frac{\sum_i N_i}{||\sum_i N_i||} Nv=∣∣∑iNi∣∣∑iNi
插值
在讲插值之前首先要明白重心坐标。对三角形面内任意一点一定会有
α
、
β
、
γ
\alpha、\beta、\gamma
α、β、γ满足以下等式:
(
x
,
y
)
=
α
A
+
β
B
+
γ
C
α
+
β
+
γ
=
1
(x,y)=\alpha A+\beta B+\gamma C \\ \alpha+\beta+\gamma=1
(x,y)=αA+βB+γCα+β+γ=1
在三角形内部,
α
、
β
、
γ
\alpha 、\beta、\gamma
α、β、γ为非负数,这可以作为判断点是否在三角形的依据。求解
α
、
β
、
γ
\alpha 、\beta、\gamma
α、β、γ就简单多了,
1 把三角形坐标带入上述公式,求解。
2 通过以下公式进行求解
3 通过以下公式进行求解
对已经得到 α 、 β 、 γ \alpha 、\beta、\gamma α、β、γ的重心坐标,满足以下性质:每个重心坐标的某个属性,都可以通过以下公式求解出来。下图是对重心坐标的颜色进行插值。
Phong Shading(Shading each pixel)
对模型的每个点进行着色,然后对点包围的三角形进行颜色插值。