Java LWJGL VBO使用MESA库崩溃游戏

Java LWJGL VBO使用MESA库崩溃游戏,java,opengl,lwjgl,vbo,mesa,Java,Opengl,Lwjgl,Vbo,Mesa,在我的一个LWJGL项目中,我一直在使用VBO来平铺2D地形。它在macOS和Windows上运行得很好,但是在我的linux分区中,游戏没有运行。我能找到的唯一主要区别是linux发行版将OpenGL版本报告为OpenGL版本3.0 Mesa 11.2.2,而在macOS上,它报告的是OpenGL版本2.1 ATI-1.48.21。我已经在各种不同OpenGL版本的设备上进行了尝试,我唯一能看到的问题是mesa库。以下是我用来构建和渲染VBO的类: import java.nio.FloatB

在我的一个LWJGL项目中,我一直在使用VBO来平铺2D地形。它在macOS和Windows上运行得很好,但是在我的linux分区中,游戏没有运行。我能找到的唯一主要区别是linux发行版将OpenGL版本报告为
OpenGL版本3.0 Mesa 11.2.2
,而在macOS上,它报告的是
OpenGL版本2.1 ATI-1.48.21
。我已经在各种不同OpenGL版本的设备上进行了尝试,我唯一能看到的问题是mesa库。以下是我用来构建和渲染VBO的类:

import java.nio.FloatBuffer;
import java.util.ArrayList;

import org.lwjgl.BufferUtils;
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.opengl.*;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;

import data.DataManager;

public class TerrainVBO {
    FloatBuffer verticies;
    FloatBuffer textCoords;
    ArrayList<Float> verticiesArray = new ArrayList<Float>();
    ArrayList<Float> textCoordsArray = new ArrayList<Float>();
    int vaoHandle;
    float invAtlasWidth;
    float invAtlasHeight;
    public TerrainVBO(DataManager dm) {
        invAtlasWidth = 1f/dm.settings.atlasMap.get("dimensions")[0];
        invAtlasHeight = 1f/dm.settings.atlasMap.get("dimensions")[1];
    }
    public void addVertex(float x, float y) {
        verticiesArray.add(x);
        verticiesArray.add(y);
    }
    public void addTexture(float x, float y) {
        textCoordsArray.add(x);
        textCoordsArray.add(y);
    }
    public void addQuad(float x, float y, float width, float height) {
        addVertex(x,y);
        addVertex(x+width,y);
        addVertex(x+width,y+height);
        addVertex(x,y+height);
    }
    public void addTextureQuad(int[] pos) {
        float x = pos[0] * invAtlasWidth + 0.001f;
        float y = pos[1] * invAtlasHeight + 0.001f;
        addTexture(x,y);
        addTexture(x+invAtlasWidth - 0.002f,y);
        addTexture(x+invAtlasWidth - 0.002f,y+invAtlasHeight - 0.002f);
        addTexture(x,y+invAtlasHeight - 0.002f);
    }
    public void preWrite() {
        verticies = BufferUtils.createFloatBuffer(verticiesArray.size());
        textCoords = BufferUtils.createFloatBuffer(textCoordsArray.size());
        for (int i = 0; i < verticiesArray.size(); i++) {
            verticies.put(verticiesArray.get(i));
            textCoords.put(textCoordsArray.get(i));
        }
        verticies.flip();
        textCoords.flip();
    }
    public void write(Texture texture) {    
        Color.white.bind();
        glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

        int verticiesBufferHandle = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, verticiesBufferHandle);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticies, GL15.GL_STATIC_DRAW);
        glVertexPointer(2, GL_FLOAT, 0, 0L);

        int textureBufferHandle = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, textureBufferHandle);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, textCoords, GL15.GL_STATIC_DRAW);
        glTexCoordPointer(2, GL_FLOAT, 0, 0);

        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glDrawArrays(GL_QUADS, 0, verticiesArray.size());

        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }
}
import java.nio.FloatBuffer;
导入java.util.ArrayList;
导入org.lwjgl.BufferUtils;
导入静态org.lwjgl.opengl.GL11.*;
导入org.lwjgl.opengl.*;
导入org.newdawn.slick.Color;
导入org.newdawn.slick.opengl.Texture;
导入data.DataManager;
公共级TerrainVBO{
浮动缓冲区垂直;
浮动缓冲区文本坐标;
ArrayList VerticieArray=新的ArrayList();
ArrayList textCoordsArray=新的ArrayList();
瓦赫汉德尔国际酒店;
浮子;
漂浮在阳光下;
公共TerrainVBO(数据管理器dm){
invAtlasWidth=1f/dm.settings.atlasMap.get(“维度”)[0];
invAtlasHeight=1f/dm.settings.atlasMap.get(“维度”)[1];
}
公共无效添加顶点(浮动x、浮动y){
垂直排列。添加(x);
垂直排列。添加(y);
}
公共空白添加纹理(浮动x、浮动y){
textCoordsArray.add(x);
textCoordsArray.add(y);
}
公共空心添加四边形(浮动x、浮动y、浮动宽度、浮动高度){
addVertex(x,y);
添加顶点(x+宽度,y);
添加顶点(x+宽度,y+高度);
添加顶点(x,y+高度);
}
公共void addTextureQuad(int[]pos){
浮动x=位置[0]*invAtlasWidth+0.001f;
浮球y=位置[1]*垂直高度+0.001f;
添加纹理(x,y);
addTexture(x+invAtlasWidth-0.002f,y);
addTexture(x+invAtlasWidth-0.002f,y+Invatlashight-0.002f);
addTexture(x,y+invAtlasHeight-0.002f);
}
公共无效预写(){
verticies=BufferUtils.createFloatBuffer(VerticiseArray.size());
textCoords=BufferUtils.createFloatBuffer(textCoordsArray.size());
对于(int i=0;i
通过运行addQuad,可以将带纹理的四边形添加到VBO中。然后,preWrite为VBO准备渲染到屏幕,write实际执行渲染。任何关于为什么这在OpenGL的mesa实现上不起作用的想法都将不胜感激


由于程序冻结,从技术上讲它从不崩溃,因此没有堆栈跟踪。但是,这是LWJGL创建的错误日志:

当错误发生时,您是否获得堆栈跟踪?@Bartvbl这里有一个链接,指向LWJGL创建的错误日志:[link]()。我注意到的第一件事是,每次尝试绘制场景时,您都会构造缓冲区。不要那样做。构建一次缓冲区,然后每帧绑定一次。至于崩溃,这些通常发生在您错误地确认缓冲区时。OpenGL试图读取一个或多个超出边界的值,导致其崩溃。另外,我认为您需要在设置指针之前启用客户端状态。在调用指针函数时,请确保绑定了正确的缓冲区。据我所知,设置缓冲区的调用都是正确的,因此,在配置缓冲区指针之前启用客户机状态可能是问题的原因。@Bartvbl我在write方法的开头尝试启用客户机状态,但错误仍然存在。我发现奇怪的是,错误只发生在一个系统上。