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

标签 java image opengl-es textures image-formats

我正在尝试加载立方体的纹理,但我在使用的尺寸方面遇到了问题。该纹理具有 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 上工作),但异常(exception)总是相同的。所以我想原因是我以错误的方式阅读了图像。有什么想法吗?

更新

我的解决方案(使用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
}

最佳答案

然而,关于 API 的线索为零。我可以打赌,预期的格式是某种原始格式不是 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 会有帮助)

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

关于java - 加载纹理不适用于正确的纹理宽度/高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810886/

相关文章:

ios - 如何在 XCode 中以编程方式设置 UIImageView?

javascript - 处理 ContentEditable 区域中的图像点击事件

image - 删除 <img src =""> 中的双引号

android - 利用 openGL 的多线程

ios - iPad 2 上的全精度浮点纹理

swift - 我找不到我的 GLSL 代码哪里错了?

java - Spring MVC 与 Oracle ADF 有何不同?

java - 在 Java 中将实数转换为 Comparable?

java - 如何改变 JFoenix 进度条的颜色

java - 如何通过SAX解析XML并创建树列表?