用于 OpenGL 纹理映射的 Java 图像作为 ByteBuffer

Posted

技术标签:

【中文标题】用于 OpenGL 纹理映射的 Java 图像作为 ByteBuffer【英文标题】:Java image as ByteBuffer for OpenGL texture mapping 【发布时间】:2011-11-17 14:09:35 【问题描述】:

我正在使用 openGL 并试图了解纹理映射。

目前,我有以下内容可以添加我将使用的图像:

GL11.glBindTexture(GL11.GL_TEXTURE_2D, 1);
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);

GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri (GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri (GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri (GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);

GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, 32, 32, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, "imageData");

我有字符串 "imageData" 我需要一个 ByteBuffer 来存储我的图像。我怎么得到这个?该图像位于 Eclipse 的我的 src 文件夹中。

【问题讨论】:

ByteBuffer.allocateDirect(...) 【参考方案1】:

这是未经测试的,但看起来可以工作

ByteBuffer buffer = ByteBuffer.wrap(getBytesFromFile(filename));

在http://www.exampledepot.com/egs/java.io/File2ByteArray.html 有一个 getBytesFromFile 的实现

编辑:好的,这个例子现在真的没有了,所以这是一个读取 ByteBuffer 的实现

private static ByteBuffer readToBuffer(String filename) throws IOException

    File file = new File(filename);
    ByteBuffer bb = ByteBuffer.allocate((int) file.length());
    FileInputStream fis = new FileInputStream(filename);

    int bytesRead = 0;
    byte[] buf = new byte[BYTES_PER_READ];

    while (bytesRead != -1)
    
        bb.put(buf, 0, bytesRead);
        bytesRead = fis.read(buf);
    

    fis.close();

    return bb;

【讨论】:

在链接中找不到页面。 该链接对我有用,无论如何,通过搜索“java read file as bytes”可以轻松找到它 这仅在图像是已经以 opengl 喜欢的正确格式编码的原始图像时才有效。所以像 Bmp Png Jpg gif 这样的图像将不起作用 这篇文章旨在展示如何根据 OP 的问题将文件转换为字节数组。我没有声称这会将文件转换为 OpenGL 纹理友好格式。 @jeff 问题是“Java 图像作为 ByteBuffer”。这没有显示如何将图像加载到字节缓冲区中。它展示了如何将文件加载到字节缓冲区中,这对于没有解码的图像是无用的。

以上是关于用于 OpenGL 纹理映射的 Java 图像作为 ByteBuffer的主要内容,如果未能解决你的问题,请参考以下文章

Opengl 纹理映射和图像分辨率

CUDA/OpenGL InterOp:使用灰度图像作为纹理

Android OpenGL ES 纹理映射/绘图问题 - 倾斜图像

C++ openGl 纹理将图像映射到球体上

OpenGL ES之实现“大头小头”和“头部晃动”的效果

像素区域的OpenGL纹理映射