gpt4 book ai didi

java - 如何将 bufferedImage 加载为 opengl 纹理?

转载 作者:行者123 更新时间:2023-11-30 01:41:24 24 4
gpt4 key购买 nike

我正在尝试从加载的缓冲图像创建纹理,如下所示:

public static long loadTexture(String img) throws IOException{


File imgPath = new File(img);
BufferedImage bufferedImage = ImageIO.read(imgPath);


byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
int id = glGenTextures();

glBindTexture(GL_TEXTURE_2D, id);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, ByteBuffer.wrap(pixels));

glGenerateMipmap(GL_TEXTURE_2D);

return id;
}

但是这段代码给了我一个 java sigsegv 错误。我正在使用 Java.nio.Bytebuffer 因为 java 11 不支持 sun 。那么我做错了什么?图像已正确加载,大小为 4bpp:

//last 2 digits are lenght
FF-AD-6F-CB-FF-FF-FF-00-FF-FF-FF-00-FF-FF-FF-00-FF-FF-FF-00-FF-00-00-FF-FF-00-00-FF-FF-FF-FF-00-FF-FF-FF-00-FF-00-00-FF-FF-00-00-FF-FF-FF-FF-00-FF-FF-FF-00-FF-FF-FF-00-FF-FF-FF-00-FF-FF-FF-00-64

这是图片: enter image description here当然它很小,但数据是正确的。

那么为什么我会收到 sigsegv?该日志非常无用而且很长,因此我无法发布它。

如何从 4bpp 字节数组创建 opengl 纹理?

最佳答案

按照 Java Code Examples for org.lwjgl.opengl.GL11.glTexImage2D() 中的建议(示例 5)您必须循环将数据复制到 ByteBuffer:

public static long loadTexture(String img) throws IOException{

File imgPath = new File(img);
BufferedImage image = ImageIO.read(imgPath);

int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = ByteBuffer.allocateDirect(image.getWidth() * image.getHeight() * 4);

for(int h = 0; h < image.getHeight(); h++) {
for(int w = 0; w < image.getWidth(); w++) {
int pixel = pixels[h * image.getWidth() + w];

buffer.put((byte) ((pixel >> 16) & 0xFF));
buffer.put((byte) ((pixel >> 8) & 0xFF));
buffer.put((byte) (pixel & 0xFF));
buffer.put((byte) ((pixel >> 24) & 0xFF));
}
}

buffer.flip();

int id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(),
0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
glGenerateMipmap(GL_TEXTURE_2D);

return id;
}

注意,glPixelStorei(GL_UNPACK_ALIGNMENT, 1)在这种情况下是不必要的,因为 RGBA 像素的大小是 4 个字节,因此每行对齐到 4 个字节,并且 GL_UNPACK_ALIGNMENT 默认为 4。

此外,如果您想使用Mipmaps ( glGenerateMipmap ),则缩小函数 (GL_TEXTURE_MIN_FILTER) 必须为 GL_NEAREST_MIPMAP_NEARESTGL_LINEAR_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_LINEAR。 (参见glTexParameter)

关于java - 如何将 bufferedImage 加载为 opengl 纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com