【问题标题】:Loading texture doesn't work with the correct texture width/height加载纹理不适用于正确的纹理宽度/高度
【发布时间】:2011-01-28 00:19:30
【问题描述】:

我正在尝试为立方体加载纹理,但我使用的尺寸有问题。纹理具有二的幂(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 时,异常消失但立方体显示错误颜色:

正如 bestsss 提到的,原因可能是某种原始格式。问题:我无法解决这个问题。我尝试了多种图像和格式。使用 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
}

【问题讨论】:

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


    【解决方案1】:

    然而,关于 API 的线索为零。我敢打赌,自 262144 =2^18(或 256*256*4)以来,预期的格式是某种原始格式 NOT gif。 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 的方式会有仅使用包含常量指定格式的栅格的 direct 缓冲区来指向。 (即没有像 jpeg/bif/png 这样的其他图像存储/传输格式有帮助)

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

    【讨论】:

    • 好吧,我的图像读取一定是错误的,因为我尝试了多个不同的图像、图像类型,但它总是相同的。有什么想法吗?
    • 如果我找到了一个我不会问的教程...你能提供一个更好的解决方案吗?或者你会推荐的教程?只是说“你加载图像的方式不是很好”并没有真正帮助我(因为那是我在多个“教程”中找到的方式)我不是要求你为我编写解决方案,而是提供更详细的帮助会很好
    • 很好 :) 今晚我会更深入地了解一下。我不建议您像这样从 http 加载任何内容,捕获异常并继续使用可能未初始化的 imageBuffer ,这甚至不是局部变量。缓冲区本身是堆一,而且我看到您使用本机 API,所以它们很可能需要直接缓冲区。
    • 对不起,我的时间有点紧迫:/
    • 不,需要感到抱歉;没有冒犯,我什至不会认为你粗鲁
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2016-03-24
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多