1

こんにちは、ディスプレイに描画する 35 枚の画像があります。私は7X5グリッドでそれを描いています。画像はインターネットからダウンロードしたものです。画像がダウンロードされるたびに、35 枚の画像全体を描画しようとします。しかし、それらのいくつかはまだダウンロードされていません。そのため、代わりにデフォルトのタイルをいくつか描画します。問題は、画像がダウンロードされるたびに、以前に描画した画像も再度描画していることです。減らしたい。そこで、Texture Atlas のようなものを作ろうと考えていました。私は手動でそれをやろうとしています。で大きな画像を作成し、 でglTexImage2Dサブ画像を追加することでそれを行っていglTexSubImage2Dます。

glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, (*tex));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, textureImageInfo->format, textureImageInfo->texWidth, textureImageInfo->texHeight, 0, textureImageInfo->format, GL_UNSIGNED_BYTE, NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureImageInfo->imageWidth, textureImageInfo->imageHeight, textureImageInfo->format, GL_UNSIGNED_BYTE, textureImageInfo->image);

35 を呼び出しglTexSubImage2Dて、35 枚すべての画像を big に追加しますglTexImage2D。ここでは、説明を簡単にするために 1 つだけ書きました。それから最後に私はします

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->tileCoordList); 
glTexCoordPointer(3, GL_FLOAT, 0, this->tileTextureCoordList);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

今私が混乱しているのは、glTexSubImage2D?? または、1回だけで十分です。テクスチャをバインドするものを理解していない実際の問題は、それで何かをしなければなりません。ありがとう。

4

1 に答える 1

8

テクスチャには「サブイメージ」のようなものはありません。テクスチャには画像しかありません。glTexImage2Dテクスチャ内の特定の画像にストレージを割り当て、オプションでその画像にデータをアップロードします。glTexSubImage2Dデータを画像にアップロードするだけです。「サブ」とは、必ずしもすべてではなく、イメージの一部を更新できることを意味します。

glTexImage2Dmallocの後に続くようなものmemcpyです。glTexSubImage2Dはただのmemcpy. glTexImage2Dそのため、最初に電話する必要があります。

于 2013-03-08T06:11:22.943 に答える