mipmapped纹理如何采样?

问题描述:

我的问题特别是关于金属,因为我不知道如果答案会改变为另一个API。mipmapped纹理如何采样?

我相信我至今不解的是这样的:

  • 一个mipmapped质感已预先计算“细节层次”,其中详细的较低水平以某种有意义的方式下采样原始纹理创建。

  • Mipmap级别是指以细节级别递减的级别,其中0级别是原始纹理,而较高级别是它的两次幂减少。

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

我不太明白的是如何选择这些mipmap级别。在金属标准库的documentation中,我看到可以采用样本,可以指定或不指定lod_options类型的实例。我认为这种说法改变如何纹理贴图水平的选择,并有明显3种lod_options为2D纹理:

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

不幸的是,文档不会解释这些选项的作用。我可以猜测bias()偏差一些自动选择的细节水平,但那么偏见value是什么意思?它的操作规模是什么?同样,的lod如何转换为离散的mipmap级别?并且,在gradient2d()使用纹理坐标的渐变的假设下运行,它如何使用该渐变选择mipmap级别?

更重要的是,如果我省略了lod_options,那么如何选择mipmap级别呢?这是否根据正在执行的功能类型而有所不同?

而且,如果sample()函数的默认no-lod-options指定的操作是做类似于gradient2D()(至少在片段着色器中)的东西,它是利用简单的屏幕空间导数还是直接工作使用光栅化器和内插纹理坐标来计算精确的渐变?

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

这是一个比较大的课题,你可能会更好,询问关于https://computergraphics.stackexchange.com/但是,很简单,兰斯·威廉姆斯纸"Pyramidal Parametrics"介绍了三线性过滤和‘MIP映射’,具有从保罗来了个建议赫克伯特(见第三页第一栏),我认为在某些系统中,我认为这种情况在某种程度上仍然可以使用。

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