2011-12-29 96 views
0

在OpenGL中,我繪製了一個2D等距網格。 (圖片:http://i.imgur.com/nUZax.png)。請不要介意這些草率的代碼,因爲很多這只是嘗試了一些東西,我試圖讓我的手弄髒這些東西,然後纔會正確地編寫實際引擎的平鋪部分。OpenGL,等距2D地圖和紋理

每塊瓷磚寬76像素,高38像素。現在我想用我製作的一點草紋紋理每塊瓷磚。但是,這不會很好!

我的問題是,紋理不斷看起來都搞砸了。它的尺寸小於它的尺寸(如尺寸的一半),並且被白色包圍。這是我用來應用紋理的代碼(它當然是76x38的尺寸!)。

void drawSquare(int x, int y) { 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glBegin(GL_QUADS); 
     glTexCoord2i(38, -19); glVertex2i(x+38, y); 
     glTexCoord2i(-38, 19); glVertex2i(x, y+19); 
     glTexCoord2i(38, -19); glVertex2i(x-38, y); 
     glTexCoord2i(-38, 19); glVertex2i(x, y-19); 
    glEnd(); 
} 

這是計算X代碼的一部分,Y.

for (int y = 1; y < gridY+1; y++) { 
    for (int x = 1; x < gridX+1; x++) { 
     drawSquare((x-y) * 38 + (SCREEN_SIZE_X/2), (x+y) * 19); 
    } 
} 

我應該也補充一點,我把我的鄰位的設置是這樣的。

glOrtho(0, SCREEN_SIZE_X, 0, SCREEN_SIZE_Y, -1, 1); 

(SCREEN_SIZE_X和SCREEN_SIZE_Y擺明了800×600)

任何人都可以幫助我在這裏?這將不勝感激。也許要更清楚一點,這就是它現在的樣子!

編輯: 經過一些幫助後,它已被更改爲此。

glBegin(GL_QUADS); 
//glColor3f(r, g, b); 
glTexCoord2f(0,1); glVertex2i(x+38, y); 
glTexCoord2f(1,1); glVertex2i(x, y+19); 
glTexCoord2f(1,0); glVertex2i(x-38, y); 
glTexCoord2f(0,0); glVertex2i(x, y-19); 
glEnd(); 

結果:http://i.imgur.com/sOqsH.png

回答

3

紋理座標應該使用GL_TEXTURE_2D時去從0到1,而不是從-38到19。

另外,您應該使用glTexCoord2f()代替。

編輯: 這可能是最容易/最好的方法:畫整機的質感作爲一個四,並啓用透明度(混合),只要確保你的紋理有彎道100%透明!

注意:由於您始終使用整個紋理,因此仍然可以使用glTexCoord2i()。但是如果你要製作紋理圖集,那麼glTexCoord2f()是必需的。

void drawSquare(int x, int y) { 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glBegin(GL_QUADS); 
     glTexCoord2i(0, 0); glVertex2i(x-38, y-19); 
     glTexCoord2i(1, 0); glVertex2i(x+38, y-19); 
     glTexCoord2i(1, 1); glVertex2i(x+38, y+19); 
     glTexCoord2i(0, 1); glVertex2i(x-38, y+19); 
    glEnd(); 
} 

記住:紋理座標原點(0,0)是左下方

而且,不要忘記設置blendMode爲:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

此外,請務必裝入你的紋理與alpha通道,如果它仍然不能正常工作,請確保alpha通道存在於你的opengl紋理中。

+0

我已經嘗試過,但紋理仍然出來所有borked了。我可以告訴你在這種情況下它是怎麼樣的。 – 2011-12-29 15:46:27

+0

你把你的紋理座標夾在0和1之間嗎?嘗試只使用0和1,看看紋理是否顯示_completely_在每個瓷磚,如果沒有,那麼別的是錯的...... – Rookie 2011-12-29 15:54:07

+0

更新了原始的文章與截圖和代碼。 – 2011-12-29 15:54:19