Graphics 为什么我们需要纹理过滤(双线性、三线性、各向异性…)

Graphics 为什么我们需要纹理过滤(双线性、三线性、各向异性…),graphics,3d,textures,texture-mapping,Graphics,3d,Textures,Texture Mapping,也许我对纹理贴图是如何实现的理解是错误的。我最近纯粹用Java构建了一个3D引擎(我知道我手头有很多时间),我完成了纹理映射部分。我这样做的方式是,当我把像素画到屏幕上时,我在那个位置查找纹理的颜色。我知道纹理过滤有助于减少以更倾斜的角度远距离观看时纹理上的模糊度。但为什么这个问题一开始就出现了呢?在我的实现中没有。缩小图像时为什么会丢失分辨率? 这是我的引擎的图像。 两个字:奈奎斯特定理 您的纹理是一个信号,屏幕像素是采样位置(因此术语sampler用于将纹理采样到屏幕像素的单元)。奈奎斯特定

也许我对纹理贴图是如何实现的理解是错误的。我最近纯粹用Java构建了一个3D引擎(我知道我手头有很多时间),我完成了纹理映射部分。我这样做的方式是,当我把像素画到屏幕上时,我在那个位置查找纹理的颜色。我知道纹理过滤有助于减少以更倾斜的角度远距离观看时纹理上的模糊度。但为什么这个问题一开始就出现了呢?在我的实现中没有。缩小图像时为什么会丢失分辨率?

这是我的引擎的图像。
两个字:奈奎斯特定理

您的纹理是一个信号,屏幕像素是采样位置(因此术语sampler用于将纹理采样到屏幕像素的单元)。奈奎斯特定理说,要用采样忠实地表示信号,信号的频率不得超过平均采样频率的一半。如果不满足该约束,将出现别名。因此,缩小纹理时,本质上是对其进行二次采样,如果纹理信号中的采样距离大于最高分辨率纹理特征之间距离的两倍(即采样频率较低),则会导致锯齿


因此,在每个离散采样系统中,在采样器之前都有一个所谓的“抗锯齿过滤器”。

您可以很容易地理解,当您显示的像素少于原始图像中的像素时,您会丢失信息并产生令人不快的伪影。有太多的细节,你扔其中一些相当随意

想象一个序列或红/绿/蓝像素。如果每隔三个像素采样一次,将得到纯红色、纯绿色或纯蓝色的行,具体取决于从何处开始。如果采样率接近3,你会观察到一系列依次为红色、绿色、蓝色的像素。这称为别名。(就像在过去,当你通过直接抽取缩小一个精灵时,结果是灾难性的。)

解决方法是让目标像素是其覆盖的源像素的混合物,这相当于平均滤波器的效果。实际上,通过减小细节的振幅,可以更均匀地投射细节。当X和Y的比例因子不同时,过滤器将是各向异性的


还请注意,插值没有帮助,因为当您需要超像素分辨率时,插值会创建亚像素分辨率。(在上一个示例中,您将在RGB运行之间获得缓慢的混合。)

两个词:莫尔图案

见:

如果纹理中有规则的重复图案,那么当采样频率接近纹理中图案的频率时,这些大亮区和暗区的图案将显示出来

这就是为什么经常使用棋盘来显示双线性过滤的好处

尝试使用棋盘格纹理的引擎


请注意,这是一种频率混叠效应,如“奈奎斯特定理”答案中所述,但这种特殊的混叠效应很容易理解,无需任何复杂的数学运算。

我认为过滤解决的实际问题不是模糊,而是你在平面远侧得到的过度锐化外观。过滤不好会使它看起来模糊。请参阅:另外,请思考图像编辑程序在收缩图像时执行过滤的原因。您正在丢失分辨率,因为用于表示同一图像的像素更少。所以你做一些过滤,试图让这些像素分别代表多个源像素。当我缩小一个图像时,我得到的像素比我需要绘制的像素要多得多。我所要做的就是选择我想画的像素。这不会导致图像模糊。但是,当我拉伸图像时,我没有足够的像素覆盖更大的画布,我必须开始插值中间的像素,这会导致图像模糊。当你必须选择要绘制的像素时,你忽略了信息。它不会生成模糊的图像,但通常会生成锯齿状的图像。看看这个:你能看到用“最近邻”(你的算法)缩小图像和Paint.Net的“最佳”算法之间的区别吗?这是有道理的,但大多数在线来源说,没有AF会导致纹理拉伸和模糊。在我投票之前,请快速提问。那么各向异性是一种反走样算法吗?@JackLe:不是。各向异性是一个名词(如字典中所述),它描述了无论方向如何,事物都不相同。在纹理滤波的情况下,各向异性意味着滤波截止频率在两个方向之间变化,以反映任一方向上的采样密度。另外,你通常不使用过滤“算法”,而是使用方法(意思上的细微差别)。显然,屏幕上的像素在垂直方向上的延伸与在三维空间中的水平方向不同。MIPmapping使用各向同性缩放,这意味着缩放的纹理在x和y方向上收缩相同的量,这不适合屏幕上像素的拉伸方式。各向异性使用RIP贴图,将纹理一次拉伸一个方向,从而找到“完美”的纹理贴图大小。谢谢,tho:)