4

私は OpenGL を初めて使用し、現在、それぞれが異なるテクスチャを持つ 4 つの面を持つ立方体をレンダリングしようとしています。

ご存知のように、顔の種類ごとに個別のテクスチャを使用すると、メモリが大量に消費され、アプリケーションが遅くなります。

現時点では、スプライトにテクスチャ シートを使用しようとしています。各テクスチャが 16x16 ピクセルで、256 個のスプライトが正方形 (16x16) に配置されたグラフィック ファイルがあります。

そんなこと知ってる

GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(1.0f, 1.0f,  1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(0.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(0.0f, 0.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(1.0f, 0.0f, 1.0f);

スプライト シート全体を含む四角形u表示されるので、1.0f 未満にする必要がありますvglTexCoord2f

今必要なのは、テクスチャ内の任意のスプライト IDのuとを計算する数式です。v

テクスチャ ビットマップでは、ID は次のようになります。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 16 20 21 22 23 24...

そして、これらの ID のいずれかに対してuandが必要です。v最後の部分はあまり説明されていないので、必要に応じてより詳しく説明します。

前もって感謝します!

4

2 に答える 2

5

画像内のスプライトのテクスチャの位置は 16 x 16 の配列になっているため、テクスチャの位置 (最初のテクスチャを 0 として数える場合) は次のようになります。

row = texNo / 16;
col = texNo % 16;

座標は次のとおりです。

u0 = row / 16;
u1 = (row + 1) / 16;

v0 = col / 16;
v1 = (col + 1) / 16; 

次に、必要に応じて 1.0f を u1 または v1 に置き換え、glTexCoord2Df 呼び出しで 0.0f を u0 または v0 に置き換えます。

于 2010-12-27T20:13:07.920 に答える
1

スプライト シートは 0..1uからv. 16x16 の場合、左上隅はn/16, m/16、n、m の範囲が 0..15 の場所にあります。シートがすべて 16x16 の場合、テクスチャ マトリックスに 1/16 を割り出すことで作業を簡素化できます。

        glMatrixMode(GL_TEXTURE)
        glLoadIdentity()
        glScalef(1f/16f, 1f/16f, 1f)

これにより、マトリックスのスケーリングにより、0,0、1,0、2,0 などのスプライトを整数でアドレス指定できます。

このようなテクスチャ マトリックスを使用することのさらなる利点は、テクスチャ座標が整数になり、頂点配列または VBO で整数型を使用してテクスチャ座標を表すことができるようになることです。

于 2010-12-27T20:12:09.343 に答える