Java LWJGL VBO使用MESA库崩溃游戏
在我的一个LWJGL项目中,我一直在使用VBO来平铺2D地形。它在macOS和Windows上运行得很好,但是在我的linux分区中,游戏没有运行。我能找到的唯一主要区别是linux发行版将OpenGL版本报告为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
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方法的开头尝试启用客户机状态,但错误仍然存在。我发现奇怪的是,错误只发生在一个系统上。