视频&图片来源:【B站】GAMES101-现代计算机图形学入门-闫令琪
Guide
1. 着色
1.1 重心坐标
1.1.1 在三角形内部进行插值
- 特指三角形在顶点进行操作
- 在整个三角形中获得平滑的变化数值
- 定义的内容:纹理映射,颜色,法向量…
- 怎么做:重心坐标.
1.1.2 重心坐标
给定一个三角形,在这个三角形所在平面内的任意一点
(
x
,
y
)
(x,y)
(x,y)都能表示成三角形三个顶点坐标的线性组合。
前提:三个系数
α
,
β
,
γ
\alpha,\beta,\gamma
α,β,γ满足
α
+
β
+
γ
=
1
\alpha+\beta+\gamma=1
α+β+γ=1
特殊情况:当这个点在三角形内,三个系数
α
,
β
,
γ
\alpha,\beta,\gamma
α,β,γ都是非负的。
面积比可以求出三个系数:
简化公式(不用记):
1.1.3 重心坐标的使用
先算出重心坐标在哪,然后插值填色。
一个问题:在投影变换下,重心坐标可能发生改变。(投影变换时三角形发生形变,重心坐标可能改变)
1.2 纹理查询
1.2.1 双线性插值
纹理放大通常会导致纹理分辨率不足(纹理太小,很多pixel会映射到同一个texel上)
解决方法:双线性插值
- Step 1. 线性插值: l e r p ( x , v 0 , v 1 ) = v 0 + x ( v 1 − v 0 ) lerp(x,v_0,v_1)=v_0+x(v_1-v_0) lerp(x,v0,v1)=v0+x(v1−v0), x x x是 [ 0 , 1 ] [0,1] [0,1]上的指
- Step 2. 两个辅助插值(水平):
u 0 = l e r p ( s , u 00 , u 10 ) u_0=lerp(s,u_{00},u_{10}) u0=lerp(s,u00,u10)
u 1 = l e r p ( s , u 01 , u 11 ) u_1=lerp(s,u_{01},u_{11}) u1=lerp(s,u01,u11) - Step 3. 竖直方向插值,得到结果: f ( x , y ) = l e r p ( t , u 0 , u 1 ) f(x,y)=lerp(t,u_0,u_1) f(x,y)=lerp(t,u0,u1)
如果在正中间,能得到四个点的平均值。
1.2.2 Mipmap
形成原因:像素覆盖区域各不相同,一个像素覆盖纹理区域过大,会产生走样。
解决方法:
- 超采样:OK,但花销高!
- Mipmap:只能做高速、近似、正方形的范围查询,存储量比原来增加了三分之一
理论:
具体操作:
L − L- L−长度微分,大概就是说像素覆盖纹理的一小片区域(近似成正方形)
1.2.3 三线性插值
在双线性插值的基础上,加一个层与层之间的插值。
两次查询,一次插值,结果完全连续,默认方法。
1.2.4 局限性
Mipmap局限性:远处模糊
解决部分三线性插值的方法:各向异性过滤Anisotropic Filter(考虑的方向性????)