如何对mipmapped纹理进行采样?

时间:2017-08-26 08:16:18

标签: ios macos textures metal mipmaps

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

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

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

  • Mipmap级别以降序级别的详细信息引用,其中级别0是原始纹理,而更高级别是它的两次幂减少。

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

我不太了解的是如何选择这些mipmap级别。在金属标准库的documentation中,我看到可以采用样本,无论是否指定lod_options类型的实例。我会假设这个参数改变了如何选择mipmap级别,并且2D纹理显然有三种lod_options

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

不幸的是,文档并没有解释任何这些选项的作用。我可以猜测bias()偏向某些自动选择的细节级别,但是偏差value是什么意思?它的运作规模是多少?同样,lod的{​​{1}}如何转换为离散的mipmap级别?并且,假设level()使用纹理坐标的渐变,它如何使用该渐变来选择mipmap级别?

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

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

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

1 个答案:

答案 0 :(得分:0)

这是一个相对较大的主题,你可能最好在https://computergraphics.stackexchange.com/上询问,但是,非常简短地说,Lance Williams'引入三线性过滤的文章"Pyramidal Parametrics"术语" MIP映射",有一个来自Paul Heckbert的建议(见第3页,第1栏)我认为在某些系统中仍然可以使用。

实际上,计算MIP地图级别的方法通常基于您的屏幕像素是一个小圆圈的假设,并且该圆圈可以映射回纹理以获得大致椭圆形。您可以估算以最高分辨率贴图的纹素表示的长轴的长度。然后,它会告诉您应该采样哪些MIP贴图。例如,如果长度为6,即在2 ^ 2和2 ^ 3之间,则您希望在MIP地图级别2和3之间进行混合。