2011-04-20 106 views
2

我有一個8 X 8點的網格,並希望覆蓋它上面的圖像。我將6 X 6的內部網格分成4個相同的子部分,每個部分的大小爲3 X 3。讓我們稱這個子部分爲瓦片。這個想法是渲染這些瓷磚以及它們相應的紋理。我將網格劃分爲瓦片,因爲將來我想在更大的網格上測試它。 我已經完成了它使用以下方法,但我沿邊緣接縫。我無法弄清楚接縫出現的原因。如何將貼圖無縫地映射到網格上?

首先,瓷磚的對應起始座標爲{(0,0),(0,3),(3,0),(3,3)}。

我有一個8×8大小的圖像,我想疊加在super_grid上,我將它的rgba值存儲在一些super_data(8×8)中。

渲染瓷磚時,我將它們繪製爲四邊形,然後在其上覆蓋相應的紋理。因此,如果(a,b)開始爲某個特定的tile創建配角,那麼我初始化四個頂點= {(a-0.5,b-0.5),(a + 3-0.5,b-0.5), (a + 3-0.5,b + 3-0.5),(a-0.5,b + 3-0.5)}和ys = 1 /(tileHeight + 1)= 1/4,則 紋理座標爲{(xs/2,ys/2),(1-xs/2,ys/2),(1-xs/2,1 -YS/2),(XS/2,1-YS/2)}

所以,對於所述第一瓦片,

quadVertices={(-0.5,-0.5),(3.5,-0.5),(3.5,3.5),(-0.5,3.5)} 
textureCoords={(1/8,1/8),(1-1/8,1/8),(1-1/8,1-1/8),(1/8,1-1/8)}. 

之前,通過一個紋理圖塊我初始化質地:INT image = new int [tileWidth + 2] [tileHeight + 2]通過使用super_data。我們採用這些尺寸是因爲某些部分的貼圖紋理與相鄰的貼圖相重疊(這就是爲什麼我們在計算quadVertices時考慮這部分的原因)。

最後,以生成紋理,使用上面

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tileWidth + 2, tileHeight + 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

一切正常,我與覆蓋在它像一個網格。但是,我在邊緣接縫。我怎樣才能擺脫接縫?

回答

0

您需要確保位於相同位置(或相鄰位置)的頂點使用精確的紋理座標。根據世界座標進行計算,看起來你正在做,應該能夠處理。

問題的第二部分是紋理本身。確保紋理在放置時能夠正確鋪平。重疊的瓷磚會變得更加困難;通常你只要確保邊緣匹配正確。

+0

只要計算進行,邊緣應該正確匹配。我注意到的一件事是,如果我在計算紋理座標時用xs替換xs/2,那麼我不會得到接縫,但是這不是正確的方式,因爲我們從所有角度以xs/2拉伸原始紋理。 – techno 2011-04-21 15:43:27

1

你有多邊形平滑嗎?嘗試將其關閉:

glDisable(GL_POLYGON_SMOOTH) 
1

嘗試GL_CLAMP_TO_EDGE而不是GL_CLAMP

相關問題