2017-04-01 55 views
-1

我創建了一個貼圖着色器,用於平鋪紋理(它實際上是一個紋理數組,正如代碼中所示)。但是,每個圖塊周圍都有一個非常醜的像素邊框。我知道這可能是由函數的不連續性引起的,導致mipmapping時發生奇怪的事情,但我禁用了mipmapping(儘管我使用了抗鋸齒)。這裏是我的代碼:當Mipmapping被禁用時,如何擺脫平鋪邊框

vec2 tiledCoords = fract(pass_textureCoords * 256.0)/4.0; // pass_textureCoords are the texture coordinates 

out_Color = texture(testArray, vec3(tiledCoords.x, tiledCoords.y, 0)); // testArray is the sampler2DArray 

我想我得給一點寬容的舍入誤差,但我似乎無法弄清楚哪裏放那。 我怎樣才能擺脫這些醜陋的邊界?提前致謝!

下面是截圖: Ugly lines

+0

什麼是紋理參數設置爲?關於包裝模式和過濾器。 – pleluron

+0

@pleluron無包裝模式或過濾器。我使用'glTexSubImage3D'定期加載紋理(因爲它是一個數組),並且在渲染前簡單地綁定紋理。 –

+0

你也使用'GL_CLAMP_TO_EDGE'嗎?如果沒有(如你的評論所示),那麼紋理座標'0.0'和'1.0'在你的紋理之外,並且你碰到了黑色的邊框。你需要移動一個紋理,所以如果你的紋理是'256x256',那麼座標應該在間隔'<1/256,255/256>'而不是'<0.0 , 1.0>' – Spektre

回答

2

我不完全相信你正在嘗試用你的代碼的計算做。第一行似乎沒有貢獻結果(在第二行覆蓋)。由於您沒有設置濾鏡模式或換行模式,因此您將啓用默認設置,即線性濾鏡和重複模式。

看起來您正在使用[0,0.25]範圍內的tiledCoords,並嘗試從0.25換到0.在這種情況下,線性過濾不會自動工作,因爲沒有0.25的自動換行模式 - > 0轉換。黑線是由[0,1 /(2 * num_pixels)]範圍內的線性插值引起的,因爲此區域在第0個紋素和第-1個紋素之間線性插入(這是由於包裝模式是您的最後一個紋素質地)。同樣的事情發生在範圍[0.25 - 1 /(2 * num_pixels),0.25],其中你直接在紋理座標0.25左邊的像素內插紋理右邊的像素。

沒有辦法爲您的場景獲取硬件線性插值。您可以使用最近鄰採樣或手動計算線性插值。