Java 如何将BuffereImage加载为opengl纹理?

Java 如何将BuffereImage加载为opengl纹理?,java,opengl,png,textures,bytebuffer,Java,Opengl,Png,Textures,Bytebuffer,我尝试从加载的缓冲图像创建纹理,如下所示: public static long loadTexture(String img) throws IOException{ File imgPath = new File(img); BufferedImage bufferedImage = ImageIO.read(imgPath); byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getD

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

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 one。 那么我做错了什么?图像已正确加载,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
图片如下: 这当然很小,但数据是正确的

那我为什么要买sigsegv?日志很没用,而且很长,所以我不能发布它

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

如(示例5)所示,您必须在循环中将数据复制到
ByteBuffer

public static long loadTexture(字符串img)引发IOException{
文件imgPath=新文件(img);
buffereImage image=ImageIO.read(imgPath);
int[]像素=新的int[image.getWidth()*image.getHeight()];
getRGB(0,0,image.getWidth(),image.getHeight(),pixels,0,image.getWidth());
ByteBuffer buffer=ByteBuffer.allocateDirect(image.getWidth()*image.getHeight()*4);
对于(inth=0;h>16)和0xFF));
put((字节)((像素>>8)和0xFF));
put((字节)(像素和0xFF));
put((字节)((像素>>24)和0xFF));
}
}
flip();
int id=glGenTextures();
glBindTexture(GL_纹理_2D,id);
glTexParameterf(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
glTexParameterf(GL_TEXTURE_2D、GL_TEXTURE_MAG_FILTER、GL_LINEAR);
glTexImage2D(GL_纹理_2D,0,GL_RGBA8,image.getWidth(),image.getHeight(),
0,GL_RGBA,GL_无符号字节,缓冲区);
GLGENATEMIPMAP(GL_纹理_2D);
返回id;
}
注意,在这种情况下不需要,因为RGBA像素的大小为4字节,因此每行对齐为4字节,
GL\u UNPACK\u ALIGNMENT
默认为4


此外,如果要使用(),则缩小功能(
GL\u纹理\u最小\u过滤器
)必须是
GL\u最近的MIPMAP\u最近的
GL\u线性的MIPMAP\u最近的
GL\u最近的MIPMAP\u线性的
GL\u线性的MIPMAP\u线性的
。(请参见)

glTexParameterf(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性MIPMAP_线性);给我一个1280的错误,但如果我把它取出来,它就工作了。一旦我真的提交了文件,我就接受这个anwsertexutre@user2741831抱歉,我已交换了
GL\u纹理\u最小\u过滤器
GL\u纹理\u MAG\u过滤器
。修好了。非常感谢。不客气。