2015-04-12 66 views
2

(我在苹果金属这样做,但我认为这个问题适用于OpenGL和DirectX过。从金属或OpenGL代码示例是非常受欢迎的。)如何降低采样纹理

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

例如,smallTex具有尺寸32x32bigTex具有128x128

我需要的bigTex内容下采样成smallTex使得smallTex每个像素包含在bigTex对应像素的平均值。

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

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

我读过这可以使用mipmaps(基本上是原始纹理的下采样副本)完成。但后来我不得不对bigTex使纹理映射,这将对性能产生负面影响,因为我在做很多渲染(计算)步骤上bigTex,这将导致大量的工作,为GPU更新的贴图。

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

这可能吗?任何提示?

回答

0

Metal texture2d.sample()方法中的线性过滤可以在内核中正确执行有限的下采样,但是它是线性过滤,当下采样因子超过2时,数据可能开始丢失。当然,您当然可以重复使用此方法,以2倍的系数下降样本直至您接近。

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

这个振荡也可引起神经网络图像识别过滤器的问题,由于振铃信号可被误认为是内容(例如毛发),导致问题为网络的准确性。但是,通常情况下,网络的训练是如何使用它。

MPS还提供MPSImagePyramid用于产生的mipmap。