Lecture 9: Shading 3 (Texture Mapping cont.
一、三角形插值 Interpolation Across Triangles:重心坐标
- 为什么要插值
- 知道顶点属性时,我想要知道三角形内部任意一点的属性
- 想要平滑过渡到三角形内部点
- 插值得到什么
- 纹理、颜色、法线向量……
- 怎么进行插值
- 使用重心坐标 Barycentric coordinates
1.重心坐标
①重心坐标计算
-
三角形内任意一点都可以通过三个顶点的值进行线性表达(α、β、γ都是非负的)
-
A点的重心坐标:(x,y) = αA+βB+γC —— (α,β,γ) = (1,0,0)
-
求任意一点的 (α,β,γ)
-
三角形自己的重心(质心)坐标
②重心坐标在插值顶点属性
V
A
_{A}
A、V
B
_{B}
B、V
C
_{C}
C可以为属性值
三维空间中,不能在投影变换后再做插值
二、纹理映射Texture Mapping
- 纹理坐标是定义在三角形顶点上的,我们需要使用重心坐标将顶点处的纹理坐标插值到三角形内部的每个像素上
- 纹理映射用于表示模型的漫反射颜色 (diffuse color),也就是 Blinn-Phong 反射模型中的 Kd
1.纹理映射的步骤
- 对于屏幕上每个像素 (x, y),计算出该像素对应的纹理坐标 (u, v)
- 使用纹理坐标从纹理中采样出颜色值 texcolor
- 将采样得到的颜色值 texcolor 设置为该像素的颜色
2.纹理太小——放大
- 会出现以下情况:
- 锯齿(Jaggies): 当纹理被放大时,边缘会出现锯齿状的外观,因为像素化变得更加明显
- 模糊(Blurry): 当纹理被放大时,细节可能会变得模糊,因为像素值被拉伸以覆盖更大的屏幕区域
- 采用方法:
- 双线性插值 Bilinear Interpolation
3.双线性插值 Bilinear Interpolation
- 插值方法
- 先找到最近的四个点
- u
01
_{01}
01、u
11
_{11}
11以及u
00
_{00}
00、u
10
_{10}
10分别进行插值
- 再对u
0
_{0}
0和u
1
_{1}
1进行插值
4.纹理太大——缩小
- 远处一个像素覆盖太多信息,求平均值代表一整块是不准确的
- 会出现锯齿和摩尔纹的情况
- 如果对结果做反走样处理(Supersampling超采样),效果可以但是开销太大
- 一个像素里面有很多纹理像素,需要很多信号频率
- 超采样还需要更多的采样频率
- 解决方法:Mipmap —— 允许我们进行 快速、近似(不准确)、正方形的范围查询,从而避免走样
三、Mipmap —— 一张图生成一系列图
1.存储量
- 将第0层存储量视为1,第1层为 1 4 \frac{1}{4} 41,以此类推 总存储量约为 4 3 \frac{4}{3} 34,仅仅比原来多了 1 3 \frac{1}{3} 31
- 层级越高、分辨率越低
2.计算Mipmap的层级
①估计足迹大小
- 足迹:屏幕像素在纹理空间中覆盖的区域
- 足迹大小:足迹大小决定了选择哪个分辨率的纹理图像进行渲染
- 估计足迹大小:屏幕像素相邻的四个采样点在纹理空间中的坐标,计算屏幕像素在纹理空间中的宽度和高度变化率(du/dx, dv/dx, du/dy, dv/dy)
②计算足迹对角线长度L
③计算Mipmap层级D
- D = log 2 \log_2 log2L
④用正方形来近似
- 根据L来判断查询的层数
⑤示例
- 假设屏幕像素相邻四个采样点在纹理空间中的坐标分别为:(u00, v00), (u10, v10), (u01, v01), (u11, v11)
- 计算屏幕像素在纹理空间中的宽度和高度变化率:
du/dx = (u10 - u00) / (x10 - x00)
dv/dx = (v10 - v00) / (x10 - x00)
du/dy = (u11 - u01) / (y11 - y01)
dv/dy = (v11 - v01) / (y11 - y01) - 假设计算得到的 L = 0.25,则 Mipmap 层级 D = log2(0.25) = -2。这意味着应该选择分辨率为 1/4 的纹理图像进行渲染
- 其中x和y为像素在屏幕空间中的x和y值
- 计算屏幕像素在纹理空间中的宽度和高度变化率:
3.三线性插值 Trilinear Interpolation
- 当计算的D在两层之间(比如1.8在2层和1层之间),则需要对两层进行线性插值
4.局限性
- 会有过渡模糊的情况 :
- 只能进行正方形的近似查询
- 三线性插值也是近似的
5.各向异性过滤(比mipmap更好)
①解决的问题
- 像素足迹形状不规则问题
- 纹理细节丢失问题 —— 各向异性过滤可以在不增加存储空间的情况下,更好地保留纹理细节
②方法一:Ripmaps
- Ripmaps: Ripmaps 是一系列沿着纹理对角线方向缩放的纹理图像,通过查找 Ripmaps 表格,可以快速找到与屏幕像素“足迹”形状相匹配的纹理图像,并进行采样
③方法二:Summed Area Tables(SAT)
- Summed Area Tables: Summed Area Tables 是一个包含纹理像素值总和的表格。通过查找 Summed Area Tables 表格,可以快速计算出屏幕像素“足迹”范围内所有像素值的总和,并进行加权平均。
- 加权平均:得到屏幕像素的最终颜色值
④方法三:EWA过滤
- 使用椭圆加权平均来计算屏幕像素的颜色。椭圆的形状和大小与屏幕像素在纹理空间中的**“足迹”形状相匹配**
- 可以处理任意形状的“足迹”
⑤局限性
- 计算成本高,需要更多的纹理采样和加权计算
- 实现复杂,需要更精确的足迹形状分析