第 28 章 纹理、Mipmap 与抗锯齿:为什么远处的地面会”闪”
往前翻我们聊过”像素是最小颗粒""画面是被切成格子网格”这条主线(那是第 3 章),又聊了”用 UV 把一张 2D 贴图裹到 3D 表面”这件事(第 5 章)。你以为”贴图贴上就完事”了?这一章我要给你看一个几乎每个新手都会撞见、且第一眼完全摸不着头脑的怪现象。
先抛个你大概率见过的画面:
你站在一片大草地上,往远处看——地平线附近那片草地,是不是在”闪烁""抖动”?像信号不好的电视雪花,又像水面反光在跳。你走近它,又不闪了;你转个头,它又在那儿跳。你啥也没改,它就自己在那抖。这是显卡坏了,还是贴图坏了?
再给你一个更生活化的:你拿手机拍一个穿”细条纹衬衫”的人,照片里那件衬衫,条纹不是整齐的线,而是一团扭曲的、忽宽忽窄的波纹——这叫”摩尔纹”。你肉眼看真人衬衫好好的,一拍就糊成波浪。
这两件事——游戏里远处地面”闪”、拍照出摩尔纹——是同一个病,而且这个病和你在第 3 章学的”像素是方块、连续被切成离散”是亲兄弟。这一章,我们就把”闪”和”锯齿”这两类最折磨人的画质问题,从现象一路扒到引擎里的旋钮。
我先把全章的钥匙交给你:
所有”闪""抖""摩尔纹""锯齿”,本质上都是”采样”惹的祸——计算机想用有限个格子(像素、纹素)去代表一个其实很密的图案,结果在某些角度看不全、采不准,于是画面出现了原本不存在、且随视角乱跳的假细节。
记住这句话,我们一层层走。
28.1 采样定理的直觉:连续信号变成离散采样,频率不够会怎样
咱们从最朴素的一个问题开始。你第 3 章学过,画面是把”连续的颜色”切成像素格;第 9 章(声音那章)你学过,声音是把”连续的声波”切成采样点。这两刀,切的都是”连续→离散”。
现在问一句尖锐的:切得不够密,会出什么事?
28.1.1 车轮倒转:一个人人都见过的”假运动”
你肯定在电影、电视里见过这个经典镜头:一辆快速行驶的汽车,轮子明明在往前转,可画面里它却在慢慢”倒转”,或者”静止不动”。这是为什么?
车轮上有一个标记点(比如红点)。真实世界里,车轮每秒转很多圈,那个红点一秒钟绕了好几圈。但摄影机(或游戏渲染)是”一帧一帧”拍的——比如每秒 24 帧。问题来了:
- 第 1 帧,红点在 12 点钟方向。
- 第 2 帧(1/24 秒后),红点真实位置转过了一大圈还多,但画面只”拍”到它落在了 11 点钟方向(因为转太快,相邻两帧之间它其实绕了好几圈,摄影机只抓到一个”看起来只挪了一点点”的相位)。
- 第 3 帧,红点又落在 10 点钟……
你眼睛连起来看,红点好像在”倒着走”。真相是:物体的真实运动频率,高过了摄影机的采样频率(帧率),于是采样把”高频运动”错误地重建成了”低频的假运动”。
这就是信号处理里”采样定理”(奈奎斯特-香农)在”时间维度”上的体现:要还原一个频率为 f 的信号,你的采样率必须高于 2f,否则高频会被”折叠”成低频假象。声音那边(第 9 章)叫”混叠(aliasing)“;画面时间这边,叫”车轮倒转”。
28.1.2 摩尔纹:空间上的”车轮倒转”
把刚才的”时间采样”换到”空间采样”,就是拍照出摩尔纹的原因。
细条纹衬衫:衬衫上黑白条纹很密,比如每厘米 10 条。相机传感器呢?也是一格一格的像素。当你拍它时,传感器的像素格去”数”衬衫的条纹——如果条纹太密,一个像素格横跨了好几条条纹,传感器就”数不清”了,只能取个平均或者乱抓几个点。结果:原本规整的直条纹,在照片上变成了扭曲的、缓慢起伏的波浪纹。这波浪纹是真实衬衫上根本不存在的,是”采样网格”和”真实密纹”打架产生的假图案。
类比再狠一点:这就像你用一把梳子(像素格)去盖另一把更密的梳子(衬衫条纹)。两把梳子的齿对不齐时,重叠处会透出一些忽宽忽窄的缝——那些缝就是摩尔纹。它纯属”两个网格的频率打架”,和衬衫本身没关系。
关键结论(这一章的命根子):当一个”被采样的图案”比”采样网格”还密时,采样就会出错,产生虚假的、且随相对位置乱跳的图案。这些假图案,图形学统一叫”走样 / 混叠(aliasing)”。
而游戏里”远处地面闪”,正是这个原理在 3D 贴图上的翻版。下一节咱们就把它钉死。
28.2 为什么 3D 表面贴图会闪:一个纹素被映射到几十个屏幕像素
现在我们把”摩尔纹”那套,原封不动搬到 3D 游戏里。这是本章最该讲透的一节,慢一点。
28.2.1 先复习两个老朋友:纹素与 UV
回忆第 5 章:贴图是一张 2D 图,图里最小格子叫纹素(Texel,Texture Element 的缩写,即纹理像素)。UV 是顶点带的 (u,v) 坐标,标好”模型这个 3D 点,对应贴图上哪个点”。
所以,当你看屏幕上某一个屏幕像素(Pixel,第 3 章学的画面最小格子),它背后其实要”去贴图上找对应颜色”——通过 UV 反算,找到贴图上对应的那个纹素,把它的颜色借过来。
一个屏幕像素 ←→ 一个纹素,这是最理想、最”对齐”的情况。
28.2.2 远处的悲剧:几十个屏幕像素,争抢同一个纹素
问题出在”距离”。你想想一片大草地:
- 草地中央、离你近的那块,表面在屏幕上摊得开,1 个屏幕像素大约对应贴图上 1 个纹素——采样公平,没问题。
- 但地平线附近、离你远的草地,整片在屏幕上被压缩成了薄薄一条。假设那片远处草地,在 3D 世界里占了几百平方米,贴图是 1024×1024 的精细草纹;可它在屏幕上只占了几十行像素高。
于是:贴图上密密麻麻的草叶细节(高频图案),被硬塞进稀疏的屏幕像素里。 一个纹素,对应屏幕上几十个像素;或者说,几十个屏幕像素,要去贴图里”跳着”找各自的纹素。
28.2.3 采样点跳变 → 闪烁:和摩尔纹一模一样
回忆 28.1 的命根子:“被采样的图案比采样网格还密 → 采样出错 → 假图案乱跳”。
现在:远处草地的”草叶密纹”远比”屏幕像素网格”密。GPU 取色时,是按屏幕像素的位置去贴图里”点名”要某个纹素。可是——屏幕像素是固定的格子,而草地那个面在 3D 空间是斜的、在动(你走路、转头,远近微小变化)。于是相邻两帧,同一个屏幕像素”点名”到的纹素,可能从草叶亮处跳到草叶暗处。
连起来看:这一帧这块地偏亮,下一帧偏暗,再下一帧又亮……在屏幕上就是一片疯狂抖动的闪烁。而且你一动,跳法就变,所以它”跟着你视角跳”。
这就是”远处地面闪”的全部真相:不是显卡坏了,不是贴图坏了,是”远处一个纹素被映射到几十个屏幕像素”,高频草纹在稀疏像素网格上被错误采样,产生了随视角乱跳的假高频——摩尔纹在 3D 贴图上的版本。
28.2.4 连回第 3 章和第 5 章:还是那把”连续→离散”的刀
你发现没,这又是第 3 章那条哲学:
- 第 3 章:连续颜色 → 切成像素格 → 格子粗了出马赛克/锯齿。
- 第 5 章:连续纹理细节 → UV 贴到离散表面 → 拉伸/接缝。
- 本章:密的纹素图案 → 被稀疏屏幕像素采样 → 远处闪(高频 aliasing)。
三者同一个祖宗:现实/贴图里的细节是”高频连续”的,计算机只能用”有限格子”去采,采不过来就出假象。 而且这次的假象会”动”——因为 3D 里视角一变,采样关系就变,所以闪。
自检一句:如果我说”近处不闪、远处闪,是因为远处纹素密度相对屏幕像素变高了”,你能反过来用 28.1 的话解释吗?——远处”被采样的图案(草纹)比采样网格(屏幕像素)密得多”,于是走样。近处两者差不多,所以没事。
28.3 Mipmap 怎么治这个病:提前”缩小好”,远处直接用小的那张
好,病根找到了:远处图案太密、屏幕像素太疏,采样采不准。工程师怎么治?
28.3.1 思路:与其”现场硬采样密图”,不如”提前准备好模糊版”
既然远处反正看不清(人眼远处本就糊,第 8 章雾化也利用了这点),那我何必每次都拿那张 4096 的精细大图,去喂给只剩几十像素的远处地面?我干脆提前把这张大图,预先缩小成一系列”越来越小”的版本:
- 原图 1024×1024
- 缩一半:512×512
- 再缩一半:256×256
- 128×128、64×64、32×32……一直缩到 1×1
每一张都是”把上一档的细节预先平均掉”得到的。注意这个”平均”很关键——它等于提前把高频细节(会惹事的草叶密纹)抹平了。
这串”从大到小、预先模糊好”的图,就是 Mipmap(多级渐远纹理,MIP 来自拉丁语 “multum in parvo”,意为”小而全”)。
28.3.2 GPU 怎么挑:按距离,远的用小的
渲染时,GPU 对远处那个表面说:“你离镜头远、在屏幕上就几十像素,别去读 1024 那张了,直接读 64×64 那张小图吧。“小图本身已经把草纹平均掉了,只有低频色块——而屏幕像素刚好够采这些低频,于是采样公平、不再跳变,闪烁消失。
这就叫”按距离挑合适清晰度”。你自己手机里其实天天用这招:聊天发图用缩略图(快、省流量),点开才加载原图(清)。Mipmap 就是给每张贴图预存了一整套”缩略图”,GPU 按物体远近挑对应尺寸。
生活类比再贴切一点:你书架远处那本精装书,书脊上的小字你反正看不清,远看就是一团色。Mipmap 等于”提前给这本书做了个远处版封面,把小字糊成色块”。你站着看(近)给原版,走远了给糊版——反正你远看也只需要知道”是红皮书”就够了。这既清楚又不浪费你的视力(= 不浪费带宽)。
28.3.3 代价:显存多约 1/3,以及它和第 5 章”贴图要压缩”的同源权衡
天下没有免费午餐。Mipmap 是要占地方的:
你生成的那一串缩略图,总大小是原图的 1/3 左右(等比数列求和:1 + 1/4 + 1/16 + … ≈ 4/3,所以多花约 1/3)。一张 64MB 的 4K 贴图,开 Mipmap 就变成约 85MB。
可这 1/3 换来两样东西,性价比极高:
- 画质:远处不闪不噪,彻底解决 28.2 的闪烁。
- 性能:远处不再硬读 64MB 大图,读几 KB 小图,显存带宽骤省(带宽比单纯显存更金贵,回忆第 1 章”显存是金子”、第 3 章 3.4.4 那笔账)。
这正好和第 5 章 5.3 讲的”贴图要压缩”是同一个权衡逻辑:为了流畅/不爆显存,用”提前预处理 + 利用感知弱点(远处看不清)“去换。压缩是”把单张图砍小”,Mipmap 是”多备几张小的”——殊途同归,都是在”显存/带宽”和”画质”之间做交易。
反问你一句:既然多花 1/3 显存几乎只赚不亏,为什么游戏几乎都默认开 Mipmap?——答案就在上面:它同时治了”闪”和”带宽”两个病,代价却只是 1/3 显存,而这 1/3 相对贴图压缩省下的那一大笔,根本不算啥。所以”开 Mipmap”是少数”稳赚”的旋钮。你能想到什么场景反而该关掉它吗?(提示:像素风游戏,1/3 显存换来的模糊反而破坏了硬邦邦的格子美学。)
28.4 纹理过滤的四种档位:对付”纹素和像素对不齐”的不同手艺
开了 Mipmap,远处不闪了。但还有个日常问题:贴图像素(纹素)和屏幕像素,大小、角度经常对不齐。一个屏幕像素可能压在贴图好几格纹素之间,或者反过来一个纹素被拉成好几个屏幕像素。取色取哪格?这就是纹理过滤(Texture Filtering) 要管的。
回忆第 5 章 5.3.5 提过它,这里我讲全四种档位,并说清各自适合什么。
28.4.1 Point(最近邻):最硬、像素风专用
Point Filtering(点过滤 / 最近邻):取离采样点最近的那个纹素,直接用,不掺和别的。
后果:放大贴图时,一个纹素被拉成一大块硬邦邦的方块——就是像素游戏的那种”大格子感”。它不模糊、不走样到假细节,但也绝不柔和。
适合:像素艺术风格(故意要硬边、要复古格子感)。不适合:写实游戏(会显得糙、有块块感)。
28.4.2 Bilinear(双线性):2×2 平均、柔和
Bilinear Filtering(双线性过滤):取采样点周围 2×2 共四个纹素,按距离做加权平均,得到一个”中间色”。
后果:放大时,相邻纹素的颜色被揉在一起,方块感消失,变得柔和。这是绝大多数游戏、绝大多数贴图的默认档。它治好了 Point 的”硬块块”,代价是稍微糊一点(因为平均掉了些锐利)。
生活类比(承接第 5 章的铺砖师傅):瓷砖(纹素)和地面格子(屏幕像素)不对齐时,与其硬切露出方块边(Point),不如把相邻瓷砖颜色揉一揉再铺(Bilinear),接缝就柔了。
28.4.3 Trilinear(三线性):在 Mipmap 层级之间也插值
Bilinear 有个小毛病:当 GPU 在远处从”256 那档”切到”128 那档”时,两档之间会”啪”地跳一下——你可能会看到远处地面突然变清晰或变糊一下。
Trilinear Filtering(三线性过滤):在 Bilinear 的基础上,再在”相邻两级 Mipmap 之间”也做一次插值。等于把”换档”也揉柔了。远处切换 Mipmap 级别时不再跳变,丝滑过渡。
代价:比 Bilinear 多算一点(要采样两级 Mipmap 再混合),但现代 GPU 几乎零压力。所以很多引擎默认就是 Trilinear——它 = Bilinear + 无跳变。
28.4.4 Anisotropic(各向异性):斜着看地面时更清楚
前三种过滤,都假设”纹素是被等比缩小”的。可现实里有个常见情况打破这个假设:你斜着看地面。想想赛车游戏里,你贴地往前看,那条公路——近处清楚、越往远处越被压成一条细线。在屏幕空间里,这条公路在”纵深方向”被拉得极长,在”横向”却没那么长——它是非等比、各向异性(anisotropic,意为’不同方向尺度不同’) 的。
普通 Bilinear/Trilinear 按”正方形”去采样,面对这种”一条被拉长的面”,会在拉长方向采不准,结果:地面远处糊成一条、细节丢失。
Anisotropic Filtering(各向异性过滤,常简称 AF,带等级如 2x/4x/8x/16x):专门按”拉长方向”做补偿采样——在公路被拉长的那个方向多采几倍样本。于是斜看的地面、远处公路,依然清晰锐利。等级越高(16x),补偿越强越清,但越费带宽。
适合:一切”有大片地面/地板/公路斜着延伸”的场景(驾驶、射击、开放世界)。代价是带宽,但相对画质提升很值。
一张速查表收这节:
| 档位 | 手艺 | 观感 | 适合 |
|---|---|---|---|
| Point | 取最近纹素 | 硬方块、像素风 | 像素艺术 |
| Bilinear | 2×2 平均 | 柔和、略糊 | 通用默认 |
| Trilinear | Bilinear + Mipmap 间插值 | 柔和、远近不跳 | 通用更好默认 |
| Anisotropic | 按拉长方向补偿采样 | 斜看地面清晰 | 驾驶/开放世界 |
28.5 抗锯齿:抗的是”几何边缘的锯齿”,和纹理闪烁是两回事
讲到这,你可能以为”闪”和”锯齿”是一伙的。错,得拆开——这是新手最容易混的一对概念。这一节讲清”抗锯齿(Anti-Aliasing,简称 AA)“,并强调:它抗的是”几何边缘(物体轮廓)的阶梯状锯齿”,不是 28.2 那种”纹理闪烁”。 两者病根不同,药也不同。
28.5.1 为什么斜线在像素网格上会出阶梯
回忆第 3 章:像素是方块,画面是方块网格。现在你画一条 45 度的斜线——比如一根旗杆斜着立。理想的线是光滑的斜线,但屏幕只能填方块格。于是 GPU 只能把斜线”经过”的那些方块点亮。结果:那条本该光滑的斜线,边缘变成了一格一格的”楼梯台阶”(staircase),像狗牙。这叫几何走样(geometric aliasing)。
类比:你用乐高方块去拼一个斜放的圆柱体,方块边缘必然是台阶状的。像素就是乐高方块,斜线就是那个圆柱体边——台阶免不了。
注意它和 28.2 纹理闪的区别:
- 纹理闪烁:是”贴图内部密纹”被稀疏像素错误采样 → 画面里出现假的高频、且随视角跳。
- 几何锯齿:是”物体轮廓(一条斜线/曲线)“被方块网格切碎 → 边缘出现固定的台阶,不动也丑,但一般不”闪”。
一个动一个不动,一个在”贴图内部”,一个在”物体边界”。病根都是”离散采样跟不上连续细节”,但发生位置和表现不同,所以解法分开。
28.5.2 MSAA:对边做超采样,质量好但贵
MSAA(Multisample Anti-Aliasing,多重采样抗锯齿):思想是”在几何边缘多算”。它对每个像素,不止算一次,而是在像素内部取多个子样本点(比如 4 个),分别判断”这个子样本点在不在物体里”,再合成。边缘那些”半在半不在”的像素,就被混出了中间色,台阶被柔化成渐变——锯齿消失。
它聪明在哪:只对边(几何覆盖)做多重采样,不对贴图颜色做多重采样,所以比”全屏超采样(SSAA)“便宜很多,质量又好。是早期 3D 游戏的主力。
代价:每个像素要存多个子样本的深度/覆盖信息,显存和带宽开销明显(4x MSAA 大约多一倍带宽)。在手机上偏贵。
28.5.3 FXAA:后处理阶段模糊边缘,便宜但晕
FXAA(Fast Approximate Anti-Aliasing,快速近似抗锯齿):换个思路——不碰几何,等画面都画完了,在”后处理”阶段,拿一张成品图,去”找图中的亮暗边界(那基本就是锯齿处),把边界模糊一下”。纯 2D 图像处理,极快、几乎不占带宽,任何硬件都能开。
代价:它是”无脑模糊边界”,所以不仅柔化了锯齿,也柔化了该清楚的细节——画面整体有点”发晕、发糊”,尤其在文字、细线上明显。而且它对”纹理闪烁”完全无效(因为它只认亮度边界,闪是时域问题)。
28.5.4 TAA:跨帧累积,省且稳但要处理残影
TAA(Temporal Anti-Aliasing,时域抗锯齿):最新主流。思想是”借时间”——这一帧只在原位置算 1 个样本,但把”上一帧、上上帧算过的样本”,按像素运动(相机/物体移动)对齐后累积起来,等效于”用多帧的样本拼出超采样效果”。
好处:单帧极便宜,却能达到接近 MSAA 甚至更好的质量,且顺带能压一点纹理闪烁(因为它跨帧平均)。现代 3A 游戏默认它。
代价:因为它是”拿历史帧凑”,当物体/相机快速运动时,历史样本对不齐,会出现残影、鬼影(ghosting)——比如快速转头时,边缘拖出一条淡影。工程师要用”运动矢量 + 拒斥(rejection)“去修,调不好就糊。
28.5.5 Unity 里 Camera 的 Anti-aliasing 怎么选
Unity(尤其 URP/HDRP)的 Camera 组件里有 Anti-aliasing 模式可选,对应上面几种:
- None:不抗锯齿,性能最好但边缘狗牙明显。
- FXAA:最便宜,适合手机/低端机,接受”整体略晕”。
- MSAA:质量好、适合 PC/主机,吃带宽,手机慎开(URP 也支持,但移动端带宽紧)。
- TAA(多在 HDRP):质量最高最稳,但要处理鬼影,且依赖运动矢量。
经验选法:手机/2D → FXAA 或 None;PC 写实大作 → TAA;怀旧/像素 → None(你要的就是硬边)。
反问你:如果你看到”物体边缘有台阶状狗牙,但远处地面不闪”,该拧哪个?——抗锯齿(AA),不是 Mipmap。反之”远处地面闪、边缘还行”是 Mipmap/Aniso 的事。先分清楚病,再下药,这是本章最核心的排查纪律。
28.6 排查实战清单:把”闪”和”锯齿”分别治
我把这一章能遇到的三类常见病,整理成一张”对症下旋钮”的清单。你以后眼睛看到怪现象,先对号入座,别乱拧。
① 远处地面/草地/砖墙在”闪烁""抖雪花”
- 病因:28.2 的纹理高频走样。
- 下药:确认贴图 Mipmap 已开启(贴图导入设置里 Generate Mip Maps 勾上);若还轻微闪,调高 Anisotropic Filtering(斜看地面更稳);若贴图本身没 Mipmap(比如程序生成纹理),补上 Mipmap 生成。
- 别乱试:开抗锯齿(AA)对纹理闪基本无效,那是治边缘的。
② 物体(旗杆、屋顶、角色轮廓)边缘有”台阶状狗牙”
- 病因:28.5.1 的几何走样。
- 下药:换 Camera 的 Anti-aliasing 模式——PC 用 TAA/MSAA,手机用 FXAA;必要时提高渲染分辨率(第 3 章,分辨率高格子细,台阶自然小)。
- 别乱试:调 Mipmap 治不了边缘狗牙。
③ 近处贴图有”块块感”、放大后硬邦邦大方格
- 病因:纹理过滤设成了 Point,或 Mipmap 在极近距离误用了过小级别(少见)。
- 下药:把过滤从 Point 换成 Bilinear / Trilinear;确认不是像素风项目故意为之。
- 顺带:如果近处就糊,可能是纹素密度低(第 5 章 5.1.5),该换更大贴图或调 Tiling,而不是过滤的锅。
一张总表:
| 现象 | 真病根 | 拧哪个旋钮 |
|---|---|---|
| 远处地面闪/抖 | 纹理高频走样 | 开 Mipmap + 提高 Anisotropic |
| 边缘狗牙台阶 | 几何走样 | Camera Anti-aliasing(TAA/FXAA/MSAA) |
| 近处块块硬边 | Point 过滤 | 换 Bilinear/Trilinear |
| 斜看公路远处糊 | 各向异性未补偿 | Anisotropic Filtering 调高 |
| 整体发晕发糊 | FXAA 过度/ TAA 鬼影 | 换 AA 模式或调 TAA 拒斥 |
28.7 收个尾,连回主线
咱们把这一章扣回全书的哲学:
- 自然现象:现实里细节是连续的、高频的;人眼远处看不清。
- 现实问题(工程师的麻烦):计算机只能用有限格子(像素、纹素)去采这些高频细节;采不过来 → 28.1 走样 → 28.2 远处地面闪、28.5 边缘狗牙。
- 工程师方案 → 落进引擎的旋钮:
- 纹理闪 → Mipmap(预先生成缩小链,远处用小的)+ Anisotropic(斜看补偿)。多花 1/3 显存,治闪又省带宽。
- 过滤档位 → Point / Bilinear / Trilinear / Anisotropic,对付”纹素和像素对不齐”。
- 边缘锯齿 → 抗锯齿 AA(MSAA 对边超采样 / FXAA 后处理模糊 / TAA 跨帧累积),和纹理闪是两回事,别混。
- 你能做的:看到闪就开 Mipmap+Aniso,看到狗牙就换 AA,看到块块就换过滤。三类药物,分清楚再下。
再抬头看那张贯穿全书的表,这一章是第 3、5、9 章的亲兄弟——它们全在说同一句话:现实连续 → 计算机离散 → 采样不够就走样 → 工程师用”预先处理 + 利用感知弱点”去补。 Mipmap 是第 5 章就埋的钩子,今天你终于把它钉死了。
下一章我们进”阴影”——你会发现,阴影的本质竟然也是”一张深度图”,而且它自己也有专属的走样毛病(痤疮、浮空)。绳还会接着牵。
【思考题】
- 用”车轮倒转”或”细条纹衬衫拍照出摩尔纹”类比,解释什么是”走样 / 混叠(aliasing)“。为什么说它和你在第 3 章学的”像素是方块、连续被切成离散”是同一类病?
- 远处地面会”闪”,但近处不闪。请用 28.2 的”一个纹素被映射到几十个屏幕像素”原理解释:为什么是”远处”出事、且随你视角乱跳?
- Mipmap 要多花约 1/3 显存,为什么游戏几乎都默认开着、几乎没人关?它同时治了哪两个病?你能举出一个”反而该关掉 Mipmap”的场景吗?
- “远处地面闪”和”物体边缘有台阶状狗牙”,病根一样吗?分别该拧引擎里的哪类旋钮去治?MSAA 和 FXAA 在”怎么抗锯齿”上有本质区别吗,各适合什么硬件?
【参考答案】
- 走样/混叠 = 当”被采样的图案”比”采样网格”还密时,采样采不准,产生原本不存在、且随相对位置乱跳的假图案(车轮倒转是时间采样、摩尔纹是空间采样)。它和第 3 章同源:第 3 章是”连续颜色→切成像素格→格子粗了出马赛克/锯齿”,本章是”密的纹素图案→被稀疏屏幕像素采样→远处闪”。两者都是”连续/高频细节,被有限格子错误离散化”留下的疤。区别只在维度:一个是画面空间的格子,一个是 3D 贴图投到屏幕的采样关系。
- 近处:屏幕像素和纹素密度差不多,1 像素对 1 纹素,采样公平,不闪。远处:整片草地压成屏幕薄薄一条,密密的草叶纹(高频)被硬塞进稀疏像素,一个纹素对应几十屏幕像素。GPU 按屏幕像素位置去贴图”点名”纹素,可 3D 面斜、视角一动,相邻帧同一屏幕像素点到的纹素在亮暗处之间跳——连起来就是闪烁。所以它”远处出事、随视角跳”,本质是摩尔纹在 3D 贴图上的版本。
- 因为 Mipmap 用仅 1/3 显存的代价,同时治了”远处闪烁”(预先模糊掉高频密纹,采样稳定)和”带宽浪费”(远处不读大图、读小图)。相对第 5 章贴图压缩省下的大头,这 1/3 微不足道,收益却稳——是少数”稳赚”的旋钮,所以几乎都开。反而该关的场景:像素风游戏。它故意要硬邦邦的格子美学,Mipmap 的”提前模糊”反而破坏了那种锐利像素感,这时关掉、配 Point 过滤才是想要的味道。你能否再想一个(比如 UI 图标、完全平色的贴图,本就没高频细节,开 Mipmap 纯浪费那 1/3)?
- 病根同类但位置不同:地面闪是”贴图内部高频被稀疏像素错误采样”(时域跳变),边缘狗牙是”物体几何轮廓被方块网格切碎成台阶”(空域固定)。下药不同:闪→开 Mipmap + 提高 Anisotropic;狗牙→Camera 的 Anti-aliasing。MSAA vs FXAA 本质区别:MSAA 在”几何边缘做多重子样本覆盖”,只对边、质量好但吃带宽,适合 PC/主机;FXAA 在”后处理阶段对成品图模糊亮度边界”,极便宜但整体发晕、且对闪烁无效,适合手机/低端机。一个是”渲染时精算边缘”,一个是”画完了一刀模糊”,思路天差地别。