在 GPU 渲染中,纹理采样指的是根据一个纹理坐标 (u,v) 从纹理中获取颜色的过程。因为屏幕像素坐标和纹理坐标可能不对应一个 texel(纹素),所以需要插值或滤波算法。
1. 最近点采样(Nearest Neighbor / Point Sampling)
原理:
-
取离纹理坐标最近的 texel 的颜色,直接输出
-
不进行插值
特点:
-
速度快,计算简单
-
放大时会出现明显的像素化效果
-
缩小时可能出现锯齿和闪烁
OpenGL 设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
适用场景:
-
像素风格游戏(Pixel Art)
-
不需要平滑过渡的纹理
2. 线性采样(Bilinear Filtering)
原理:
-
取纹理坐标周围 2x2 个 texel
-
根据目标点到这 4 个 texel 的横纵距离加权平均得到的插值结果。
特点:
-
放大纹理时边缘平滑
-
缩小纹理时可能模糊
-
计算比最近点略复杂,但性能仍高
OpenGL 设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
适用场景:
-
常规 3D 渲染
-
UI 元素、普通贴图
3. 三线性采样(Trilinear Filtering)
原理:
-
结合 Mipmap 技术
-
在多级纹理(Mipmap)中取两个最接近的级别,分别用 bilinear 插值
-
再在两级 Mipmap 之间做线性插值
特点:
-
缩小时纹理平滑,不闪烁
-
适合纹理有不同分辨率层级的场景
-
开销比 bilinear 稍大
OpenGL 设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
适用场景:
-
3D 游戏远景纹理
-
地形渲染、模型贴图
4. 各向异性过滤(Anisotropic Filtering, AF)
原理:
-
针对 视角倾斜的纹理,Mipmap 采样会导致模糊或拉伸
-
各向异性过滤根据纹理在屏幕上的投影比例,在不同方向取不同采样密度
-
保持边缘和细节清晰
特点:
-
对倾斜纹理效果好
-
可以提高远距离纹理清晰度
-
性能消耗高于 trilinear,但比超级采样低
OpenGL 设置:
GLfloat aniso = 0.0f; glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &aniso);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, aniso);
适用场景:
-
地面、道路、墙面等倾斜纹理
-
第一人称视角远景
5. 总结对比
| 采样算法 | 纹理插值方式 | 缩小效果 | 放大效果 | 特点 |
|---|---|---|---|---|
| 最近点(Nearest) | 无 | 锯齿、闪烁 | 像素化 | 最快、最原始 |
| 双线性(Bilinear) | 2x2 texel 线性插值 | 有模糊 | 较平滑 | 平衡性能与质量 |
| 三线性(Trilinear) | bilinear + Mipmap 级间插值 | 平滑 | 平滑 | 缩小远景更清晰 |
| 各向异性(AF) | 根据屏幕投影方向优化采样 | 清晰 | 清晰 | 倾斜纹理细节好,但开销高 |
6. 补充说明
-
Mipmap 是生成不同分辨率纹理的技术,可以配合三线性和各向异性过滤使用
-
放大时主要用 bilinear 或 nearest;缩小时三线性和各向异性能有效减少锯齿和模糊
-
不同算法适合不同场景:UI 贴图可用 bilinear,远景地形或斜面纹理建议使用各向异性
2402

被折叠的 条评论
为什么被折叠?



