【问题标题】:How to downsample a texture如何对纹理进行下采样
【发布时间】:2015-04-12 07:31:48
【问题描述】:

(我在 Apple Metal 中这样做,但我认为这个问题也适用于 OpenGL 和 DirectX。非常欢迎来自 Metal 或 OpenGL 的代码示例。)

我有一个纹理 smallTex,其大小是另一个纹理 bigTex 大小的倍数。

例如,smallTex 的维度为 32x32bigTex 的维度为 128x128

我需要将bigTex的内容下采样到smallTex,这样smallTex中的每个像素都包含bigTex中相应像素的平均值。

首先我想我可以创建一个片段着色器,它从bigTex 采样并渲染到smallTex。但是,这样我会丢失很多信息,因为采样最多读取四个像素并在它们之间进行插值。

我需要的是真正的下采样,源中的每个像素对结果都有相同的影响。

我读到这可以使用 mipmap(本质上是原始纹理的下采样副本)来完成。但是我必须在bigTex 上启用mipmapping,这将对性能产生负面影响,因为我在bigTex 上执行了许多渲染(计算)步骤,这将导致GPU 需要大量工作来更新贴图。

我需要一个直接的 GPU 命令来对纹理进行下采样。

这可能吗?有什么提示吗?

【问题讨论】:

    标签: textures gpu mipmaps downsampling


    【解决方案1】:

    Metal texture2d.sample() 方法中的线性过滤可以在您的内核中进行有限的下采样,但它是线性过滤,当下采样因子大于 2 时,数据可能会开始丢失。您当然可以使用这种方法以两倍的倍数重复传递到下采样,直到您接近为止。

    另一种方法是 MPSImageLanczosScale,它将对图像进行 Lanczos 重采样。一般来说,这对于摄影图像看起来会好得多,但对于矢量艺术和其他具有大量精确边缘的内容来说,这可能是一个糟糕的选择。在这种情况下,您会看到来自 lanczos 窗口化 sinc() 内核的振铃。

    这种振铃还会导致神经网络图像识别过滤器出现问题,因为振铃信号可能会被误认为是内容(例如头发)并导致网络准确性出现问题。通常,网络经过训练是您应该如何使用它的方式。

    MPS 还提供 MPSImagePyramid 用于生成 mipmap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多