編輯:我發現問題類似於問題here,但我仍然不能提出解決方案,因爲我的問題有點不同。手動包裝紋理座標
我正在使用C++和HLSL,並需要將紋理座標包裹起來,以便紋理平鋪在三角形上。
座標被「包裹」到0-1範圍後,它們將被旋轉,所以我不能簡單地使用紋理採樣器AddressU和AddressV屬性設置爲包裝,因爲它們需要被包裝然後旋轉,所以它可以在採樣器內部不要做。
這裏的解決方案很簡單,只需使用紋理座標的小數部分即可。
這裏是一個像素着色器的一個例子將瓦片紋理36倍(6×6) -
input.tex *= 6.0f; //number of times to tile^2
input.tex = frac(input.tex); //wraps texCoords to 0-1 range
return shaderTexture.Sample(SampleType, input.tex);
這確實瓦的紋理,但可以在邊界其中產生問題紋理包裝。這些瓷磚必須均勻分配到它們正在顯示的空間上,或者它會在邊界相交處形成一個接縫。我的正方形紋理被繪製到800x600像素,所以平鋪5將平均分割,但6不會,並將導致沿Y軸的接縫。
我已經嘗試使用模運算符input.tex = input.tex % 1
來包裹座標,但我得到完全相同的結果。我也嘗試改變紋理過濾方法,AddressU和AddressV屬性以及無數種不同的調試方法。
我有一些運氣使用此代碼。如果x座標過高它被設置爲0,如果是太低,它被設置爲1
input.tex *= 6.0f;
input.tex = frac(input.tex);
if (input.tex.x > 0.999f) input.tex.x = 0;
if (input.tex.x < 0.001f) input.tex.x = 1;
return shaderTexture.Sample(SampleType, input.tex);
這僅僅修復在特定的地點的問題了,所以它絕對不是一個解決方案。
這張圖片顯示了一個紋理(左)和手動包裝時的樣子(右)。你可以看到寄宿生觸及的並不是每個地方都有這個錯誤。
我也試過沒有改變紋理座標到0-1的範圍,並圍繞每個瓷磚的中心而不是(0.5,0.5)旋轉它們,但是我得到了相同的結果。此外,我的紋理座標完全獨立於頂點,並在像素着色器內進行計算。
我看到的與這個問題有關的任何事情都與一個像素具有高值並且接下來具有較低值有關,例如u = 0.95和下一個像素u = 0.03,這導致它向後插入紋理。但是當我旋轉我的紋理座標時,根本沒有任何變化。即使每個圖塊都應用了隨機旋轉。在這種情況下,邊緣具有彼此接近的各種不同的值,不僅左側高值而右側低值,而且接縫發生的區域不會改變。
我一直在想我希望有一種方法來找出像素之間的變化,這工作完美,並保持mipmap水平在一個常數0工作,所以我相信你是正確的,這是一個mipmapping問題。非常感謝! – Frobot 2015-02-17 18:28:38
我添加了一個答案,顯示了我是如何實現這個 – Frobot 2015-02-17 22:43:25