加载纹理不适用于正确的纹理宽度/高度

时间:2011-01-26 22:38:45

标签: java image opengl-es textures image-formats

我正在尝试为立方体加载纹理,但我使用的尺寸有问题。纹理具有两个(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);
}

当我将参数width / height更改为128时,异常消失,但立方体显示错误的颜色:

enter image description here

如上所述,原因可能是某种原始格式。问题:我无法解决这个问题。我尝试了多种图像和格式。用gimp创建它们(在ubuntu上工作),但异常总是一样的。所以我猜其原因是我以错误的方式阅读图像。一些想法?

更新

我的解决方案(使用JOGL类TextureIO和Texture):

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
}

1 个答案:

答案 0 :(得分:4)

然而关于API的零线索。我敢打赌,预期的格式是一些原始的 NOT gif ,因为262144 = 2 ^ 18(或256 * 256 * 4)。 RGB + Alpha是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格式的字节缓冲区中的字节,看看其他参赛者可用,我认为使用NIO的方式会有仅指向包含常量指定格式的栅格的直接缓冲区。 (即没有其他格式的图像存储/传输,如jpeg / bif / png会有帮助)

请再次阅读文档,查找教程,示例并继续(加载图像的方式也不是很好)