2015-09-08 50 views
0

我正在創建一個基於java/canvas的編輯器來創建紋理形狀。結果稍後在OpenGL中渲染,但我需要模擬紋理中彩色像素的插值。

假設我有一個10 texel乘1 texel的紋理。我爲畫布的一部分指定了從0.0到1.0的範圍。所以我插入每個畫布像素的紋理座標,找到兩個相鄰的紋素並插入顏色。

現在我想從tex 0.0到2.0繪製紋理重複。模數計算已經不是微不足道的,因爲1.0,2.0,...需要映射到1.0,而1.x,2.x,...需要映射到0.x.

到目前爲止,我得到這個工作,即使是負值。然而,當包裝發生時,插值是「剪切」的。不考慮最後一個紋素(1.0)和重複的第一個紋素(0.0)之間的範圍。

如何正確模擬?我想我必須處理半像素/像素偏移量。我想要0.0; 1.0繪製一次紋理,0.0; 2.0繪製兩次,-1.0; 2.0繪製三次(依此類推),並在其中重複紋理。這一定是可能的,一些簡單的移位和模數公式是正確的嗎?

是否有一些「便宜的技巧」,例如在外部添加兩個以上的texels用於連續插值,並執行一些補償魔術來解決縮放問題?在畫布上模擬OpenGL紋理包裝+插值?

回答

2

這裏的錯誤是,(0.0)的紋理座標不會觸及第一個紋理元素的中心。它擊中第一個紋理元素的左邊緣。

因此,爲了實現使用線性插值的包裝,(0.0)的紋理座標將導致讀取第一個紋理元素和最後一個紋理元素並用0.5來加權它們。然後(1.0)的紋理座標將會碰到最後一個像素的右邊緣,然後會產生與tc(0.0)相同的顏色。

enter image description here

+0

謝謝。我不想成爲聰明人,但我確實知道這一點。 ;-)我的問題是處理索引和包裝座標的計算等。基本上是每個畫布像素的紋理座標的插值,並且處理紋理座標超過[0, 1]。我當然可以在很多條件下使用它。但是,必須有一種簡單的方法來處理低級數學問題? –

+0

如果你做得正確,那麼包裝應該是一個簡單的'frac()'調用,並且像素空間的對話由紋理大小和(0.5,0.5)的減法相乘。 – dari

+0

謝謝。你是對的。應該那麼簡單。我意識到我的概念有錯誤。我想要的不是在GLSL或Canvas中工作。沿着表面重複的色標或者必須在重複之間產生硬邊,或者需要在刻度之間有額外的空間用於插值。我想我必須手工插補。無論是紋理包裝還是過濾都不會起作用,如果我只使用紋理的分數。 –