2015-04-12 105 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。