在Metal中如何计算Mipmap级别?


14

我的问题特别针对Metal,因为我不知道答案是否会针对另一个API改变。

我相信到目前为止我了解的是:

  • 贴图纹理预先计算了“细节级别”,其中通过以某种有意义的方式对原始纹理进行下采样来创建较低级别的细节。

  • Mipmap级别以递减的细节级别来指代,其中级别0是原始纹理,而更高级别是其二阶幂的减少。

  • 大多数GPU实现三线性过滤,即为每个样本选择两个相邻的mipmap级别,使用双线性过滤从每个级别中采样,然后线性混合这些样本。

我不太了解的是如何选择这些mipmap级别。在Metal标准库的文档中,我看到可以在指定或不指定lod_options类型实例的情况下进行采样。我假设此参数会更改mipmap级别的选择方式,并且显然存在3D lod_optionsfor 2D纹理:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

不幸的是,文档没有费心地解释这些选项的作用。我可以猜测会bias()偏向某些自动选择的细节级别,但是偏见value是什么意思呢?它的运作规模是多少?同样的,又是怎样lodlevel()转换成离散的纹理贴图的水平?并且,在gradient2d()使用纹理坐标的渐变的假设下进行操作时,如何使用该渐变选择mipmap级别?

更重要的是,如果我省略lod_options,那么如何选择mipmap级别?这取决于执行的函数类型吗?

并且,如果该sample()函数的默认no-lod-options指定操作是要执行类似的操作gradient2D()(至少在片段着色器中),它是利用简单的屏幕空间派生类,还是直接与光栅化器和插值纹理坐标一起使用?计算精确的梯度?

最后,设备之间的这种行为有多一致?我读过一篇老文章(在DirectX 9中是古老的文章),其中提到了复杂的设备特定的mipmap选择,但是我不知道在新的体系结构上是否可以更好地定义mipmap选择。

Answers:


17

如今,跨设备的Mip选择已经非常标准化了-各向异性过滤的一些实质性细节除外,这仍然需要各个GPU制造商来定义(其确切细节通常不会公开记录)。

OpenGL规范的第8.14节“纹理缩小”中可以详细了解有关Mip选择的好地方。我认为它在Metal中的工作方式相同。(考虑到它们同时制造了硬件和API,Apple 可能已经进行了一些更改……但是我怀疑它们已经这样做了。)我将在这里进行总结。

默认的Mip选择(不使用任何lod_options修改器)使用纹理坐标的屏幕空间渐变来选择Mip级别。本质上,它尝试选择产生尽可能接近纹理像素与像素的1:1映射的mip级别。例如,如果渐变每个像素的长度为4纹素,则它将选择2级的Mip(它是0级尺寸的1/4,因此每个像素为您提供1个贴图的texel)。

使用三线性过滤时,由于通常不会精确地按1:1映射,因此它会选择两个最接近的级别并在它们之间进行线性插值,以便在摄像机或场景中的对象移动时在mip级别之间进行平滑过渡周围。

从数学上讲是精确的:您可以获取纹理坐标的屏幕空间渐变,根据纹理尺寸对其进行缩放(以“像素像素像素”为单位),获取其长度,并选择两者中的较长者(X和Y)梯度,并计算其对数底数2。在OpenGL规范中,此量称为;它通常也称为纹理LOD(细节级别)。它只是整数mip级别索引的连续版本。因此,使用的MIP水平最接近的两个整数,和小数部分被用来在它们之间融为一体。例如,如果,GPU将采样纹理的2级和3级,然后混合到80%3级和20%2级。λλλλ=2.8

如果启用了各向异性过滤,则可以使用它们的比率来设置各向异性采样的数量,而不是简单地使用两个梯度中的较长者。例如,如果X梯度比Y梯度长4倍,则将使用4个aniso样本,它们的位置沿X梯度隔开。每个样本将是一个三线性样本,使用一个对应于X梯度的长度的(即,降低两个mip级别,因为)。λ日志21个/4=-2

现在,至于修饰符选项:

  • bias将偏移量应用于然后再使用它选择Mip级别。因此,例如,偏差+1将使其使用比通常高一级的mips进行三线性滤波。偏置-1将使mips降低一级,依此类推。λ
  • level从屏幕空间渐变完全覆盖的自动计算,并让您直接输入自己的(aka )值。λλlod
  • gradient2d使您可以输入自己的渐变矢量,以替代纹理坐标的隐式屏幕空间渐变。其余的mip选择和采样过程将正常进行,但梯度会发生变化。这使您可以自定义各向异性过滤。

在除片段着色器之外的其他类型的着色器中,没有“屏幕空间渐变”的概念,因此通常只允许后两个操作-任何尝试使用隐式渐变的操作都会产生编译错误。我不是很肯定Metal是这样做的,但这是我与其他API一起使用时的期望。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.