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过滤器
。修好了。非常感谢。不客气。