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

时间:2016-05-19 23:28:50

标签: graphics 3d textures texture-mapping

也许我理解如何实现纹理映射是错误的。我最近用Java编写了一个3D引擎(我知道我手上有很多时间),我完成了纹理映射部分。我这样做的方式是当我将像素绘制到屏幕上时,我在那个位置查找纹理的颜色。我知道纹理过滤有助于减少以更倾斜的角度观看的高距离纹理的模糊性。但为什么这个问题甚至首先出现呢?它没有在我的实施中。为什么缩小图像时会丢失分辨率?

这是我发动机的图像。 enter image description here

3 个答案:

答案 0 :(得分:4)

两个词:奈奎斯特定理。

您的纹理是一个信号,屏幕像素是采样位置(因此,单位的术语采样器,即,将纹理采样到屏幕像素)。奈奎斯特定理说,要忠实地用样本表示信号,信号必须不包含高于平均采样频率一半的频率。如果不满足该约束,则会出现锯齿。因此,当你缩小纹理时,你基本上是对它进行二次采样,如果纹理信号中的采样距离变得更大(即采样频率更低),则会导致混叠,而不是最高分辨纹理特征之间距离的两倍。

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

答案 1 :(得分:1)

两个词:莫尔条纹

请参阅:https://en.wikipedia.org/wiki/Moir%C3%A9_pattern

如果纹理中有一个规则的重复图案,那么当它的采样频率接近纹理中图案的频率时,那么大的明暗区域的这些图案就会出现

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

尝试使用棋盘纹理引擎。

请注意,此频率混叠效应,如" Nyquist定理"回答,但这种特殊的混叠效果很容易理解,没有任何复杂的数学运算。

答案 2 :(得分:0)

您可以很容易地理解,当您显示的像素少于原始图像中显示的像素时,您将丢失信息并创建令人不快的伪像。有太多的细节,你可以随意地抛出一些细节。

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

固化是让目标像素成为它所覆盖的源像素的混合,这相当于平均滤波器的效果。实际上,通过减小振幅,可以更均匀地抛出精细细节。当X和Y的比例因子不同时,滤波器将是各向异性的。

另请注意,插值没有帮助,因为当您需要的是超像素分辨率时,它会创建子像素分辨率。 (在前面的示例中,您将在RGB运行之间进行慢速混合。)