使用LWJGL开发OpenGL程序创建纹理时触发SIGSEGV段错误求助
问题原因排查
- 最常见的触发原因:LWJGL调用原生OpenGL接口时,要求传入的
ByteBuffer必须是直接缓冲区(Direct Buffer),如果你的image.getBuffer()返回的是用ByteBuffer.wrap(byte[])创建的堆内存缓冲区,原生OpenGL代码无法直接访问JVM堆内存地址,就会触发段错误。 - 第二个高频触发原因:OpenGL默认的像素解包对齐参数
GL_UNPACK_ALIGNMENT值为4,你当前使用的是3字节每像素的GL_RGB格式,2像素宽的行总长度为6字节,不是4的整数倍,驱动读取像素数据时会出现地址偏移错误,访问到非法内存触发崩溃,这也和你错误栈中libGLImage库格式转换时崩溃的特征匹配。 - 第三个可能适配问题:macOS的旧版OpenGL驱动对模糊的内部格式参数兼容性差,你传入的内部格式参数
GL_RGB没有明确指定位宽,部分驱动会出现适配错误。
解决方案
- 替换堆缓冲区为直接缓冲区
修改你的Image类中缓冲区创建逻辑,使用ByteBuffer.allocateDirect(12)创建直接缓冲区,将像素数据写入缓冲区后调用flip()切换为读模式,再返回给glTexImage2D使用。 - 调整像素解包对齐参数
在调用glTexImage2D之前添加一行代码:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
指定OpenGL按1字节对齐读取像素数据,适配3字节每像素的RGB格式。
3. 明确指定内部纹理格式
将glTexImage2D的第三个参数从GL_RGB改为GL_RGB8,明确指定内部使用8位每通道的RGB格式,避免驱动适配错误。
内容的提问来源于stack exchange,提问作者Phridge
相关产品推荐
相关产品推荐

