游戏画面设置常见的纹理过滤是什么?和信号与系统、傅立叶变换有什么联系?
前言
很多游戏玩家设置游戏画面时,常常看到纹理过滤、双线性过滤、各向异性过滤这样的选项。大多数人下意识地把它们调到最高,却不清楚这些选项到底在做什么,为什么关掉之后远处的地面会闪烁、栅栏会出现奇怪的花纹。
如果你深究下去,会发现这些选项背后藏着一套完整的数学体系——它和大学信号与系统课上学的傅立叶变换、卷积,其实讲的是同一件事。
这篇文章的目标,就是把这条线从头到尾梳理清楚。从"纹理过滤到底在干什么"开始,一步一步讲到:
- 为什么会有锯齿、闪烁、摩尔纹(Moiré Pattern)
- 为什么需要 MipMap
- 为什么锐利边缘代表高频
- 傅立叶变换到底在做什么
- 卷积为什么如此重要
- 这些概念之间到底怎么串起来
一、什么是纹理过滤
1.1 纹理映射时到底发生了什么
在图形学里,我们常常会把一张图片贴到三维模型表面,这张图片就叫纹理(Texture)。
比如:
- 地板表面的砖块图案
- 墙面的石头纹理
- 角色衣服上的花纹
- 枪械表面的磨损细节
当一个三角形(Triangle)被贴上纹理后,屏幕上的每个片元(Fragment)都会有一个纹理坐标,也就是 UV 坐标(UV Coordinates)。
问题在于:
- 屏幕是离散的像素网格(Pixel Grid)
- 纹理也是离散的纹素网格(Texel Grid)
- 但 UV 通常落在纹理上的非整数位置
- 一个屏幕像素也不一定只对应一个 texel
于是我们会遇到一个核心问题:
当一个片元要从纹理中取颜色时,到底应该怎么取?
这就是纹理过滤(Texture Filtering)要解决的事。
1.2 “过滤(Filtering)“这个词怎么理解
很多人第一次看到"过滤"这个词会有点懵,因为日常语境里的"过滤"像是在说"把杂质滤掉”。
但在图形学和信号处理(Signal Processing)里,filtering 更接近"滤波(Filtering / Filtering Operation)“这个意思,也就是:
按照某种规则,对周围样本做选择、加权、平滑或抑制,得到更适合当前使用方式的输出。
所以在纹理场景里,过滤不是"修图美颜”,而是在回答:
当前这个屏幕像素,应该如何综合纹理中的附近信息,得到一个合理的颜色。
二、最基础的纹理过滤方法
2.1 最近点采样(Nearest Filtering)
最简单的方法是最近点采样(Nearest Filtering):
- UV 落到哪里,就找最近的那个 texel
- 直接取那个 texel 的颜色
比如 UV 落在纹理坐标 (10.3, 20.7) 附近,就取最接近的那个纹素。
优点:
- 便宜、快
- 像素风游戏(Pixel Art)会故意保留这种硬边效果
缺点:
- 放大时会有明显马赛克
- 缩小时容易闪烁
- 纹理会显得很"脏”、很跳
最近点采样的本质是:只用一个样本代表当前位置,不做平滑。
2.2 双线性过滤(Bilinear Filtering)
更常见的是双线性过滤(Bilinear Filtering):
- UV 落在 4 个相邻 texel 之间
- 不再只取一个 texel
- 而是把这 4 个 texel 按距离加权插值(Interpolate)
先沿 x 方向插值,再沿 y 方向插值,因此叫双线性。
解决了:
- 放大时不再那么块状
- 纹理边缘更平滑
没解决:
- 缩小时仍然可能严重闪烁
- 细密纹理远看会乱跳
- 高频细节会出问题
双线性过滤虽然比最近点采样好,但它并没有真正解决"缩小时多个 texel 映射到一个屏幕像素"的问题。
三、为什么纹理缩小时会出问题
3.1 一个像素,不一定只对应一个 texel
很多初学者会下意识以为"一个屏幕像素就是取纹理上的一个点"。但真实情况经常不是这样。
当物体离相机很远时:
- 屏幕上一个像素,可能对应纹理上的一大片区域
- 这片区域里可能有很多 texel
例如:远处的砖地、铁丝网、窗格、文字贴图。这些表面在近处看细节丰富,但一旦远离相机,屏幕能给它们分配的像素就不够了。
3.2 这时会发生什么
如果你还像最近点采样那样,只从这一大片区域里随便取一个样本,就会出现:
- 闪烁(Flickering)
- 摩尔纹(Moiré Pattern)
- 爬动(Shimmering / Crawling)
- 远处图案乱跳
这是因为:
你明明应该对一大片纹理区域求一个"整体代表值",却只随机摸了其中一个点。
四、采样(Sampling)到底是什么
4.1 连续世界与离散表示
采样(Sampling)可以先理解成:从一个连续信号(Continuous Signal)里,不去看所有位置,而是隔一段距离取一个样本(Sample)。
图形学里到处都是采样:
- 屏幕像素是在对连续场景采样
- 纹理是在对连续表面颜色采样
- 阴影图(Shadow Map)是在对光照可见性采样
- 时间上逐帧渲染,也是在做时间采样
所以图形学本质上是一个非常"采样驱动"的学科。
4.2 采样为什么会带来问题
一旦你只看离散样本,就可能"看漏"。如果信号变化很慢,样本稀一点问题不大。但如果信号变化很快,样本太稀就一定会出问题。
这个"变化快不快",就是后面要讲的频率(Frequency)。
五、采样定理(Sampling Theorem)与奈奎斯特(Nyquist)
5.1 采样定理在说什么
最经典的奈奎斯特-香农采样定理(Nyquist-Shannon Sampling Theorem)说的是:
如果一个信号的最高频率不超过
f_max,那么采样频率f_s至少要达到2f_max,才能从采样结果中无歧义地恢复原信号。
写成公式就是:f_s >= 2 * f_max
其中:
f_s:采样频率(Sampling Frequency)f_max:信号最高频率(Maximum Frequency)
5.2 人话版理解
采样定理可以翻译成一句特别好记的话:
一个东西变化得有多快,你观察它的频率至少要比它快两倍,否则你会看错。
这个"看错"不是指"少一点细节",而是指高频信息会伪装成错误的低频信息,这就叫混叠(Aliasing)。
六、什么是混叠(Aliasing)
6.1 混叠不是"细节没了",而是"细节变错了"
很多人会误以为采样不够时,只是"信息丢失"。
其实更严重的是:高频信号会折叠成错误的低频图案。这意味着:
- 你看到的不是原来的细节
- 也不是简单的模糊
- 而是假的花纹、假的跳动、假的节奏
6.2 图形学里的混叠现象
在图形学里,混叠最常见的表现就是:
- 多边形边缘的锯齿(Jaggies)
- 远处纹理闪烁
- 摩尔纹
- 阴影边缘跳动
- 细网格、栅栏远处发脏
这些现象看起来各不相同,但底层本质是同一件事:信号频率太高,而采样率不够。
七、为什么锐利边缘代表高频
7.1 频率在图像里是什么意思
在图像中,频率(Spatial Frequency,空间频率)是指:图像内容在空间上变化得有多快。
例如:
- 大块平滑渐变:低频
- 缓慢明暗变化:低频
- 细线条、细纹理:高频
- 锐利边缘:高频很多
7.2 锐利边缘为什么是高频
想象一张图左边全黑,右边全白,中间是一条非常锐利的分界线。这意味着在很短的空间距离内,亮度从 0 突然跳到 1。这种"变化极快"的信号,需要高频成分来表示。
你可以把它理解成:
- 低频只能画缓慢、圆润的变化
- 想画很尖、很陡、很突然的跳变,就必须引入更多高频
所以:边缘越锐,包含的高频成分越多。 这就是为什么图像中的边缘最容易出锯齿、最容易出采样问题。
八、MipMap(多级渐远纹理)为什么能减少混叠
8.1 MipMap 是什么
MipMap 是同一张纹理的一组不同分辨率版本:
1024 × 1024
512 × 512
256 × 256
128 × 128
...
1 × 1
每一层都是上一层缩小一半。
8.2 MipMap 真正重要的地方
表面上看,MipMap 像是一串不同大小的纹理副本。但本质上,它在做一件非常关键的事:
在低分辨率采样之前,先把高频细节平均掉。
也就是说:物体远了 → 屏幕像素装不下原始纹理的高频细节 → 不要再去高分辨率纹理上乱采样 → 而应该使用已经预先"低通化"的低分辨率版本。
8.3 MipMap 和采样定理的关系
这正是采样定理要求的标准流程:降采样前,必须先做低通滤波(Low-pass Filtering)。
为什么?因为如果不先去掉高于当前采样率所能承受的频率,就一定会发生混叠。
MipMap 本质上就是把"低通后再降采样"这个过程提前算好,存成多个层级,供运行时快速选择。
一句话总结:MipMap 是采样定理在纹理系统中的工程实现。
九、三线性过滤与各向异性过滤
9.1 三线性过滤(Trilinear Filtering)
双线性过滤只是在某一层 Mip 上做插值。但实际使用中,当前所需的理想分辨率往往介于两层 Mip 之间。
于是三线性过滤会:
- 在相邻的两层 Mip 上分别做一次双线性采样
- 再在这两个结果之间做层间插值
解决的是:Mip 层切换过于生硬的问题。
9.2 各向异性过滤(Anisotropic Filtering)
MipMap 默认有一个简化假设:一个屏幕像素在纹理空间里的覆盖区域,大致是"接近方形"的。
但实际并不总是这样。比如你斜着看地面时,像素在纹理空间里的 footprint(足迹)往往是拉长的,某个方向需要更高分辨率,另一个方向需要更强平均。
各向异性过滤会沿着 footprint 的长轴方向取多个样本,更好地近似真实的纹理覆盖区域。
简单总结:
- Trilinear:解决"用哪两层 Mip 平滑过渡"
- Anisotropic:解决"一个像素在纹理空间里不是圆的/方的,而是拉长的"
十、为什么这些问题最后会走向"高频/低频"
当你把纹理过滤、MipMap、各向异性过滤这些现象往下追,就会发现所有问题都在问同一件事:
当前采样率能承受多高的细节频率?
这时候,“图像里到底有哪些频率成分"就成了一个关键问题。于是我们自然会走到傅立叶分析(Fourier Analysis)。
十一、傅立叶变换(Fourier Transform)是什么
11.1 一句话理解
傅立叶变换(Fourier Transform)的本质:
把一个原本按位置或时间描述的信号,改写成"它由哪些不同频率的波组成"的描述。
- 原来你看的是:这个位置的值是多少
- 变换后你看的是:这个信号里有哪些频率,每种频率有多强
这其实是在"换坐标系”。
11.2 为什么要换到频域(Frequency Domain)
因为很多问题在原空间里不好看清本质,但在频域里一下就清楚了:
- 为什么模糊会让图像发糊
- 为什么锐化会增强边缘
- 为什么边缘代表高频
- 为什么采样不足会混叠
- 为什么 MipMap 需要低通滤波
11.3 低频和高频到底是什么
你可以把图像想成由很多不同快慢的波叠加而成:
- 低频波:变化慢,负责大轮廓、大明暗
- 高频波:变化快,负责细节、边缘、纹理
于是:
- 平滑区域:低频为主
- 细节区域:高频更多
- 锐利边缘:包含大量高频
十二、正弦波(Sine Wave)为什么是天然的分析基底
12.1 正弦波为什么特殊
傅立叶分析使用正弦波(Sine Wave)和余弦波(Cosine Wave)作为基底(Basis),原因有几个:
- 它们形式简单
- 不同频率之间有很好的正交性(Orthogonality)
- 很多系统对正弦波的响应特别简单
- 复杂信号可以看成这些波的叠加
12.2 什么叫正交(Orthogonal)
在这里,“正交"不是指图上看起来垂直,而是指:
在定义好的内积(Inner Product)意义下,两者彼此不混。
对函数来说,常见内积定义是:<f, g> = ∫ f(x) g(x) dx
如果内积等于 0,就说两个函数正交。在傅立叶级数里,不同频率的正弦/余弦函数彼此正交,这意味着一个频率分量不会"污染"另一个频率分量,让我们可以很干净地把信号拆成不同频率。
12.3 正交和线性无关的区别
- 线性无关:这组对象没有冗余,谁都不是谁的线性组合
- 正交:不仅没有冗余,而且彼此在内积意义下互相垂直
所以正交通常比线性无关更强。傅立叶分析之所以好用,很大程度上就是因为这组基底不仅线性无关,而且正交。
十三、频域(Frequency Domain)到底给了我们什么
傅立叶变换的结果告诉我们:哪些频率存在、每种频率有多强、图像的高频/低频分布如何。
于是很多现象就可以从频率角度来理解:
- 模糊:压高频
- 锐化:增强高频
- 采样不足:高频折叠成错误低频
- 边缘:高频很多
- MipMap:在低采样率下先去掉多余高频
图形学里的很多"画质问题”,本质上都是频率问题。
十四、卷积(Convolution)是什么
14.1 一句话理解
卷积(Convolution)的本质:
拿一个小模板在信号或图像上滑动,每到一个位置,就根据附近邻域按某种权重做加权求和,得到当前位置的输出。
你可以把卷积理解成:对局部邻域做有规则的混合,这个规则由一个卷积核(Kernel)定义。
14.2 为什么需要卷积
我们经常想对图像做这些事:
- 模糊(Blur)
- 锐化(Sharpen)
- 边缘检测(Edge Detection)
- 降噪(Denoise)
- 特征提取(Feature Extraction)
这些操作有一个共同点:某个位置的输出,不只看它自己,还要看它周围一圈邻域。 这正是卷积天然擅长表达的事情。
十五、卷积核(Kernel)是什么
卷积核本质上就是一组权重(Weights),决定了:
- 邻域里哪些位置更重要
- 要做平均还是做差分
- 是平滑、锐化还是找边缘
均值模糊核(3×3):
1/9 * [[1,1,1],
[1,1,1],
[1,1,1]]
它做的就是看周围 9 个像素,全部平均,这会让图像变得更平滑。
高斯核(Gaussian Kernel): 中心权重大,离中心越远权重越小,比简单平均更自然。
边缘检测核: 一边是正,一边是负,强调的是"变化"。一维差分核 [-1, 1] 能把"变化快"的地方找出来,也就是边缘。
十六、为什么卷积和滤波(Filtering)几乎绑在一起
因为很多滤波操作,本质上都能写成卷积:
- 模糊 = 低通滤波(Low-pass Filtering)
- 锐化 = 强调高频
- 边缘检测 = 提取高频变化
- 图像平滑 = 邻域加权平均
卷积是实现很多局部滤波操作的标准数学形式。
十七、卷积为什么和傅立叶变换关系这么深
这里有一个特别重要的结论,叫卷积定理(Convolution Theorem):
时域/空域中的卷积,对应频域中的乘法。
也就是说:
- 在原空间里,你拿一个核到处扫
- 在频域里,相当于给每个频率乘一个权重
17.1 为什么模糊会压高频
模糊核在频域里,通常对低频乘得接近 1,对高频乘得更小。于是低频保留,高频被压制,结果就是大轮廓还在,细节和边缘被削弱。
模糊的本质就是低通滤波,而低通滤波通常可以通过卷积实现。
17.2 为什么锐化会增强边缘
锐化核往往会保留中心、对邻域做负权重,相当于"强调当前位置相对于周围的差异"。从频域角度看,就是在提升高频成分,而高频正是边缘和细节所在。
十八、把整条链串起来
到这里,我们终于可以把这条从纹理过滤到卷积的路径完整串起来了。
- 纹理过滤在解决"屏幕像素如何从纹理中取值"
- 缩小时的问题暴露出"一个像素可能对应很多 texel"
- 这本质上是一个采样问题
- 采样定理告诉我们:采样率不够时,高频会混叠
- 所以必须先做低通滤波
- MipMap 就是对纹理做预过滤的工程方案
- 要理解低通、高频、边缘,就需要傅立叶变换
- 傅立叶告诉我们:边缘和细节 = 高频
- 要在图像上实际实现这些局部滤波,就需要卷积
- 卷积定理进一步把空间域与频域连接起来
图形学里大量看似不同的画质问题,本质上都是:有限采样率如何正确表示包含高频细节的连续信号;而纹理过滤、MipMap、傅立叶变换和卷积,正是解决这件事的一整套工具。
十九、一句话速记版
| 概念 | 一句话 |
|---|---|
| 纹理过滤 | 当前像素如何从纹理里取颜色 |
| 双线性过滤 | 从附近 4 个 texel 做插值 |
| MipMap | 远处别看原图,看低频版本 |
| 各向异性过滤 | 修正像素 footprint 不是方形的问题 |
| 高频 | 变化快的细节、边缘、纹理 |
| 低频 | 变化慢的大轮廓、平滑区域 |
| 采样定理 | 采样率至少要覆盖信号最高频率的两倍 |
| 混叠 | 高频伪装成错误低频 |
| 傅立叶变换 | 把"位置/时间描述"变成"频率描述" |
| 卷积 | 用一个局部权重模板在图像上滑动做加权处理 |
| 卷积定理 | 空域卷积 = 频域乘法 |
二十、结语
很多初学者会觉得这些概念分属不同学科,但真正学通之后你会发现,它们并不是彼此独立的"知识点",而是一整套围绕"采样与频率"建立起来的共同语言。
如果你后续继续深入,这条线最自然的下一步通常是:
- GPU 是如何根据
ddx/ddy自动选择 Mip Level 的 - 高斯模糊为什么可分离(Separable)
- 为什么 TAA(Temporal Anti-Aliasing,时域抗锯齿)本质上也和采样有关
- 为什么阴影图、法线贴图、屏幕空间反射(SSR)也都会遇到类似的频率问题
到那时你会发现,图形学真正难的地方,很多时候不是"API 怎么调",而是:
你是否真正理解了采样、频率和重建。