2011-12-29 16 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(); 

結果:GL_TEXTURE_2Dを使用した場合http://i.imgur.com/sOqsH.png

答えて

3

テクスチャ座標がない-38から19まで、0から1まで行く必要があります。

また、代わりに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); 

アルファチャンネルがまだ機能していない場合は、そのアルファチャンネルがあなたのOpenGLテクスチャに存在することを確認してください。

+0

私はそれを試しましたが、それでもテクスチャはすべてボークアップしています。私はそのように見える方法をあなたに示すことができました。 –

+0

テクスチャ座標を0と1の間で固定しましたか? 0と1だけを使ってみて、テクスチャが各タイルに完全に表示されているかどうかを確認してください。そうでなければ何かが間違っています... – Rookie

+0

元の投稿をスクリーンショットとコードで更新しました。 –

関連する問題