最近,我一直在学习纹理过滤,即最近邻居过滤,双线性过滤,三线性过滤,各向异性过滤,MIP映射,RIP映射等。

从高角度来看,我认为我可以理解这些技术,以及各向异性过滤以外的工作原理和原因。各向异性过滤使我发疯。

我可以看到必须对相对于相机成一定角度的表面进行纹理化处理的问题,但我不知道如何通过梯形脚印采样来解决此问题(尽管我可以看到结果) 。这可能是因为我不了解梯形足迹是如何计算的,以及封闭的电传如何加权以对纹理进行采样。

Nvidia的这篇文章使用“当纹理像素为梯形时”或“各向异性过滤以相对于透视图的透视变形的比例缩放mipmap的高度或宽度”的句子,使我更加困惑。质地”。梯形纹理?缩放MIPmap?这甚至是什么意思?

您能帮助我掌握自动对焦和自动对焦级别的工作原理吗?

请注意,我的目标不是拥有OpenGL或DirectX AF实现,而是从更高的角度了解AF的工作原理。

#1 楼

要了解各向异性过滤的性质,您需要对纹理映射的真正含义有深刻的了解。

术语“纹理映射”是指将对象上的位置分配给纹理中的位置。这允许光栅化器/着色器针对对象上的每个位置从纹理中获取相应的数据。进行此操作的传统方法是为对象上的每个顶点分配一个纹理坐标,该坐标直接将该位置映射到纹理中的某个位置。光栅化器将在各个三角形的表面上插入该纹理坐标,以生成用于从纹理中获取颜色的纹理坐标。

现在,让我们考虑一下光栅化的过程。这是如何运作的?它需要一个三角形并将其分解为像素大小的块,我们将其称为“碎片”。现在,这些像素大小的块相对于屏幕而言是像素大小。

但是这些片段相对于纹理而言并不是像素大小。想象一下,如果我们的光栅化器为片段的每个角生成纹理坐标。现在,想象在屏幕空间而不是纹理空间中绘制这四个角。

好吧,这取决于纹理坐标。也就是说,这取决于纹理如何映射到多边形。对于任何特定的片段,它可能是一个与轴对齐的正方形。它可能是非轴对齐的正方形。它可能是一个矩形。可能是梯形。它可能几乎是任何四边形图形(或至少是凸形图形)。

如果正确地进行纹理访问,则获取片段的纹理颜色的方法就是找出这个矩形是什么然后从该矩形内的纹理中获取每个纹理像素(使用覆盖率缩放边框上的颜色)。然后将它们平均在一起。那将是完美的纹理贴图。

它也将非常慢。

为了性能,我们尝试近似实际答案。我们将事物基于一个纹理坐标,而不是覆盖纹理像素空间中整个片段区域的4个纹理坐标。

基于Mipmap的过滤使用分辨率较低的图像。这些图像基本上是完美方法的捷径,方法是预先计算将大块颜色融合在一起时的样子。因此,当它选择一个较低的mipmap,它是采用其中每个纹理像素表示纹理的区域预先计算的值。

各向异性通过近似完美的方法(其可以,而且应该被耦合过滤作品(带有mipmapping)),最多可获取固定数量的其他样本。但是,由于它仍只给出一个纹理坐标,它如何找出纹理元素空间中要提取的区域?

基本上,它是作弊的。由于片段着色器是在2x2个相邻块中执行的,因此可以计算屏幕空间X和Y中片段着色器中任何值的导数。然后,将这些导数与实际纹理坐标结合使用,以计算出的近似值。真正片段的纹理足迹将是多少。然后在该区域内执行许多示例。

下面的图有助于对其进行解释:



白色方块代表我们的质感。它只是2x2白色和黑色纹理像素的棋盘格。

橙色点是所讨论片段的纹理坐标。红色轮廓是片段的足迹,以纹理坐标为中心。

绿色框代表各向异性过滤实现可能访问的纹理像素(各向异性过滤算法的细节是特定于平台的,因此我只能解释总体思路)。

此特定图表明,一个实现可能会访问4个纹理像素。哦,是的,绿色框覆盖了其中的7个,但是中间的绿色框可以从较小的mipmap中获取,因此一次获取就可以获取4个纹理像素。该实现当然会将相对于单个texel的获取的平均值加权4。

如果各向异性过滤限制为2而不是4(或更高),则实现将选择2的这些样本代表片段的足迹。

评论


$ \ begingroup $
感谢您的解释,对于延迟的答复,我们深表歉意,但我必须抽出时间仔细阅读。我觉得我唯一不完全理解的段落就是您谈论片段着色器和派生类的那一段。屏幕空间X和Y的确切含义是什么?它是纹理坐标值吗?
$ \ endgroup $
–尼古拉·马索蒂(Nicola Masotti)
17年5月8日在13:15



$ \ begingroup $
@NicolaMasotti:“微分”是微积分术语。在这种情况下,它是在屏幕空间X或Y中整个三角形表面上纹理坐标的变化率。如果您不知道微积分,那么我将无法解释它在一个帖子中给您。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
17年5月8日在15:52

$ \ begingroup $
幸运的是,我知道什么是导数。我可以在任何地方查看确切的数学信息吗?
$ \ endgroup $
–尼古拉·马索蒂(Nicola Masotti)
17年5月8日在17:24



$ \ begingroup $
另外,我将对您的答案提出几个更改,即“取决于多边形如何映射到纹理”,而不是“取决于纹理如何映射到多边形”。另外,当您说:“使用覆盖率缩放边界上的颜色”时,您实际上是在说“边界上的权重颜色”吗?
$ \ endgroup $
–尼古拉·马索蒂(Nicola Masotti)
17年5月8日在17:31



#2 楼

您可能已经知道了一些要点,但我只想提出一些建议供其他人阅读。在这种情况下,滤波是指低通滤波,就像您可能是从高斯模糊或盒形模糊中获得的那样。我们之所以需要这样做,是因为我们要获取一些频率较高的媒体,并将其渲染到较小的空间中。如果不对其进行过滤,则将获得混叠工件,这看起来很糟糕。因此,我们滤除了过高的频率,无法在缩放版本中准确再现。 (并且我们通过了低频,因此我们使用了像模糊一样的“低通”滤波器。)

因此,我们首先从模糊的角度考虑这一点。模糊是卷积的一种。我们将卷积核乘以一个区域中的所有像素,然后将它们相加并除以权重。这给了我们一个像素的输出。然后,我们将其移至另一像素,然后再移至另一像素,依此类推。

这样做确实很昂贵,所以有一种作弊的方法。可以将一些卷积核(特别是高斯模糊核和盒式模糊核)分为水平和垂直遍历。您可以首先仅使用水平内核过滤所有内容,然后获取结果并仅使用垂直内核进行过滤,结果将与在每个点进行更昂贵的计算相同。例如:

原始图像:



水平模糊:



>“水平”后跟“垂直模糊”:



,因此我们可以将过滤分为垂直和水平通过。所以呢?好吧,事实证明,我们可以对空间变换执行相同的操作。如果您考虑透视旋转,例如:



可以分解为X比例尺:



,其后每列的比例略有不同:



所以您现在有2种不同的缩放操作。为了对此进行正确的过滤,您将需要在X中比在Y中进行更多的过滤,并且希望为每列使用不同的量进行过滤。第一列没有过滤,因为它的大小与原始列相同。第二列之所以有点,是因为它比第一列稍小,等等。最后一列是所有列中过滤效果最好的。

单词“各向异性”来自希腊语“ an”的意思“ not”,“ isos”表示相等,“ tropos”表示“方向”。因此,这意味着“在所有方向上都不平等”。这就是我们所看到的-缩放和过滤在每个方向上以不同的数量完成。