2013-01-09 28 views
3

我想知道理論推理爲什麼這甚至可能:幾何圖形的翻譯如何與紋理映射相關。2D紋理在進行子像素轉換時變形

  • 我只能注意到這種效果,當做一個子像素翻譯,紋理看起來很好,如果翻譯整個像素(S)。
  • 我使用的是正射影像,GL_CLAMP_TO_EDGE,GL_NEAREST,片段着色器是highp
  • 紋理座標是地圖集的一個子區域,但即使整個地圖集被映射,我也可以看到失真。
  • 使用OpenGL ES(Android和iOS),但請在重新制作之前,任何人都可以解釋這在OpenGL中不是問題。

事情我已經嘗試:

回答

6

的子像素數量移動將永遠改變紋理採樣。您使用最接近的採樣會影響紋理的採樣方式,但不會在首先採樣的座標處進行採樣。該座標是跨越多邊形內插的tex-coords和頂點的函數,這些頂點決定了多邊形如何被柵格化以屏蔽像素。

請記住,要在像素中心進行評估時得到完美的紋理採樣插值tex-coords,必須完全位於texel中心。

將多邊形移動一個像素的分數會改變紋理採樣的位置,因爲像素中心現在位於多邊形內的稍微不同的點。

現在,如果採樣距離最近,得到的座標將有效地回到最近的紋素像素,所以如果你的座標離中心不遠,它可能會工作。然而,當你的座標移動了大約半個像素,所以它們正好位於兩個紋理幾乎等距的點上,那麼在計算精度上只需要很小的誤差就可以一個方向微調一些像素,另一個方向。

下面是一張圖。我選擇顯示一個三角形,用一個檢查圖案進行映射,但它同樣適用於精靈或其他任何東西。

在圖的上半部分,我只是展示了三角形如何映射到紋理。如果您在高分辨率屏幕上(或以非常大的尺寸)渲染此三角形,則會期望看到完全複製的檢查圖案。

但是,如果您以更接近的比例(例如1:1)進行映射,那麼採樣是至關重要的。在圖的底部顯示了這種情況。

要看的關鍵是屏幕像素中心的位置,因爲它決定了哪些像素被繪製,以及紋理的採樣位置。在這種情況下,我已經將多邊形映射到正確的大小,但偏移了半個像素。像素中心恰好在相鄰的紋理元素之間對齊,並且採樣會非常顫抖。

Diagram showing texture sampling

+0

Thanx for the response。您能否詳細說明一下:「該座標是多邊形內插的tex-coords和頂點的函數,這些頂點決定了多邊形如何光柵化以屏蔽像素。」我不明白在子像素轉換後片段着色器中哪些參數會受到影響。 – Kimi

+0

可能最簡單的一個圖...將看到我可以做什麼在我的午休... – JasonD

+0

+1非常好的答案和很好的圖! –