3

私は他の誰かのコードを変更しています。彼らは、BufferedImage を介してロードされる PNG を使用しました。代わりに、18 バイトのヘッダーと BGR コードだけの TGA をロードする必要があります。テクスチャをロードして実行していますが、テクスチャの代わりに灰色のボックスが表示されます。これをデバッグする方法さえ知りません。

テクスチャは ByteBuffer にロードされます。

final static int datasize = (WIDTH*HEIGHT*3) *2; // Double buffer size for OpenGL // not +18 no header
static ByteBuffer buffer = ByteBuffer.allocateDirect(datasize);

FileInputStream fin = new FileInputStream("/Volumes/RAMDisk/shot00021.tga");
FileChannel inc = fin.getChannel();

inc.position(18); // skip header

buffer.clear(); // prepare for read
int ret = inc.read(buffer);
fin.close();

私はこれに従いました: [how-to-manage-memory-with-texture-in-opengl][1] ... ビデオのようにフレームごとにテクスチャを更新しているためです。

一度呼び出されます:

GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
assert(GL11.GL_NO_ERROR == GL11.glGetError());

繰り返し呼び出されます:

GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, width, height, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, byteBuffer);
assert(GL11.GL_NO_ERROR == GL11.glGetError());

return textureID;

レンダリング コードは変更されておらず、以下に基づいています。

GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, this.vertexCount);
4

4 に答える 4

1

問題を引き起こす可能性のあるいくつかのアイデア:

  • あなたのテクスチャはどこかに捨てられています。コード全体はわかりませんが、どこかに がありglDeleteTextures、間違ったときに呼び出されると問題が発生する可能性があると思います。
  • テクスチャの幅と高さは 2 の累乗ですか? そうでない場合、これはハードウェアによっては問題になる可能性があります。古いハードウェアでは、2 のべき乗でないイメージがサポートされない場合があります。
  • 他の時点での描画呼び出し間でテクスチャ パラメータが変更されました ( glGetTexParameterを使用してパラメータのデバッグ チェックを行います)。
  • 次の画像 (編集: または最初の画像)を読み込むときに、読み込みの問題が発生する可能性があります。次の画像をロードせずに最初の画像が表示されるかどうかを確認します。もしそうなら、それは上記のいずれかのケースでなければなりません。
于 2015-05-29T07:39:28.347 に答える