質問

私はキューブのテクスチャをロードしようとしていますが、使用する寸法に問題があります。テクスチャには2つのパワーがあります(256x256)。幅と高さとして256を使用する場合、例外をスローします。

java.lang.IndexOutOfBoundsException: Required 262144 remaining bytes in buffer, only had 68998
    at com.jogamp.common.nio.Buffers.rangeCheckBytes(Buffers.java:828)

コード:

private void initTexture(GL2ES2 gl) {
try {
    BufferedImage bufferedImage = ImageIO.read(new URI("http://192.168.0.39/images/box.gif").toURL());
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "gif", byteArrayOutputStream);
    byte[] imageData = byteArrayOutputStream.toByteArray();
    imageBuffer = ByteBuffer.wrap(imageData);
} catch (Exception e) {
    e.printStackTrace();
}
imageBuffer.rewind();
gl.glGenTextures(1, textureIds, 0);
gl.glBindTexture(GL2ES2.GL_TEXTURE_2D, textureIds[0]);
gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);
gl.glTexParameteri(GL2ES2.GL_TEXTURE_2D, GL2ES2.GL_TEXTURE_MAG_FILTER, GL2ES2.GL_LINEAR);
gl.glTexParameteri(GL2ES2.GL_TEXTURE_2D, GL2ES2.GL_TEXTURE_MIN_FILTER, GL2ES2.GL_LINEAR_MIPMAP_NEAREST);
gl.glGenerateMipmap(GL2ES2.GL_TEXTURE_2D);
gl.glBindTexture(GL2ES2.GL_TEXTURE_2D, 0);
}

パラメーターの幅/高さを128に変更すると、例外は消えますが、キューブには間違った色が表示されます。

enter image description here

BestSSSが述べたように、その理由はいくつかの生形式かもしれません。問題:これを修正できません。複数の画像とフォーマットを試しました。 GIMP(Ubuntuで作業)で作成しましたが、例外は常に同じです。ですから、その理由は、私が間違った方法で画像を読んだからだと思います。いくつかのアイデア?

アップデート

私のソリューション(Joglクラスのテクスチャとテクスチャを使用しています):

Texture texture;

private void initTexture(GL2ES2 gl) {
    try {
        texture = TextureIO.newTexture(new URI("http://192.168.0.39/images/box.gif").toURL(),true,null);
        texture.setTexParameterf(GL2ES2.GL_TEXTURE_MIN_FILTER, GL2ES2.GL_LINEAR_MIPMAP_LINEAR);
        texture.setTexParameterf(GL2ES2.GL_TEXTURE_MAG_FILTER, GL2ES2.GL_LINEAR);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void display(GL2ES2 gl) {
    // code snipped
    if (texture != null) {
        texture.enable();
        texture.bind();
    }
    // code snipped
}
役に立ちましたか?

解決

ただし、APIについての手がかりはゼロです。予想される形式は生の形式であるに違いありません gifではありません 262144 = 2^18以降(または256*256*4)。 RGB+アルファは4バイトです。

編集:もう一度、gl.glTexImage2D(GL2ES2.GL_TEXTURE_2D, 0, GL2ES2.GL_RGBA, 256, 256, 0, GL2ES2.GL_RGBA, GL2ES2.GL_UNSIGNED_BYTE, imageBuffer);

推測するだけで、定数を見てください:GL2ES2.GL_RGBA、GL2ES2.GL_RGBA、GL2ES2.GL_UNSIGNED_BYTE-バイトバッファーのバイトのすべてのサポートRGBA形式、他の出場者が利用できるものをご覧ください。 直接 定数で指定された形式のラスターを含むバッファー。 (つまり、JPEG/BIF/PNGのような画像ストレージ/トランスミッションの他の形式は役立ちません)

ドキュメントをもう一度読んで、チュートリアル、例を探して、続行します(画像のロード方法もあまり良くありません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top