在LWJGL中加载纹理时发生Java致命运行时错误
由于文件在LWJGL中加载纹理时发生Java致命运行时错误,java,crash,lwjgl,Java,Crash,Lwjgl,由于文件ig7icd64.dll中的异常\u访问\u冲突,我的程序正在崩溃 我正在使用LWJGL库和一些外部JAR创建一个简单的项目:(仅使用slick-util3),当从资源文件('.png')加载纹理时,程序崩溃 我有很多类,它们使用了很多GLXX.gl[函数名], 但我会解释为什么我没有列出所有这些 我用一个窗口类创建了一个窗口,该窗口类只设置了一个GLFW上下文,并且工作正常 我有一个模型类,它被UntexturedModel和TexturedModel扩展。这些设置了VertexArr
ig7icd64.dll
中的异常\u访问\u冲突
,我的程序正在崩溃
我正在使用LWJGL库和一些外部JAR创建一个简单的项目:(仅使用slick-util3),当从资源文件('.png')加载纹理时,程序崩溃
我有很多类,它们使用了很多GLXX.gl[函数名],
但我会解释为什么我没有列出所有这些
我用一个窗口类创建了一个窗口,该窗口类只设置了一个GLFW上下文,并且工作正常
我有一个模型类,它被UntexturedModel和TexturedModel扩展。这些设置了VertexArray和VertexBuffers,功能正常。
我甚至有一个着色器类,它读取两个着色器文件并应用它们,不会出现错误
public class UntexturedModel extends Model {
private int vertexArrayID, vertexBufferID, indicesBufferID, vertexCount;
public UntexturedModel(float[] vertices, int[] indices) {
vertexArrayID = super.createVertexArray();
indicesBufferID = super.bindIndicesBuffer(indices);
vertexBufferID = super.storeData(0, 3, vertices);
vertexCount = indices.length;
GL30.glBindVertexArray(0);
}
public void destroy () {
GL30.glDeleteVertexArrays(vertexArrayID);
GL15.glDeleteBuffers(vertexBufferID);
GL15.glDeleteBuffers(indicesBufferID);
}
// I have not included the getters for the IDs due to the space available
}
这扩展了模型类,如下所示:
public class Model {
protected int createVertexArray() {
int vertexArrayID = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vertexArrayID);
return vertexArrayID;
}
protected int storeData (int attributeNumber, int coordSize, float[] data) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip();
int bufferID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
return bufferID;
}
protected int bindIndicesBuffer (int[] indices) {
IntBuffer buffer = BufferUtils.createIntBuffer(indices.length);
buffer.put(indices);
buffer.flip();
int bufferID = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, bufferID);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
return bufferID;
}
}
TexturedModel本质上与UntexturedModel相同,但有一个额外的float[]textureCoords,它是使用storeData(1,2,textureCoords)添加的;它还有一个使用外部jar的属性Material:
public class Material {
private int textureID;
public Material (String file) {
try {
textureID = TextureLoader.getTexture("png", new FileInputStream("res/" + file)).getTextureID();
// Possible error location: TextureLoader is an external jar
} catch (IOException e) {
System.err.println("Error: Couldn't load texture");
System.exit(-1);
}
}
public void destroy () {
GL11.glDeleteTextures(textureID);
}
// I'm ignoring getters once again
}
使用UntexturedModel类可以很好地工作,即使使用着色器文件也是如此。我将在下面介绍BasicShader和Shader类:
public abstract class Shader {
private int vertexShaderID, fragmentShaderID, programID;
private String vertexFile, fragmentFile;
public Shader (String vertexFile, String fragmentFile) {
this.vertexFile = vertexFile;
this.fragmentFile = fragmentFile;
}
public void create () {
programID = GL20.glCreateProgram();
vertexShaderID = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
GL20.glShaderSource(vertexShaderID, readFile(vertexFile));
GL20.glCompileShader(vertexShaderID);
if (GL20.glGetShaderi(vertexShaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.err.println("Error: Vertex Shader - " + GL20.glGetShaderInfoLog(vertexShaderID));
}
fragmentShaderID = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
GL20.glShaderSource(fragmentShaderID, readFile(fragmentFile));
GL20.glCompileShader(fragmentShaderID);
if (GL20.glGetShaderi(fragmentShaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.err.println("Error: Fragment Shader - " + GL20.glGetShaderInfoLog(fragmentShaderID));
}
GL20.glAttachShader(programID, vertexShaderID);
GL20.glAttachShader(programID, fragmentShaderID);
GL20.glLinkProgram(programID);
if (GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) {
System.err.println("Error: Program Linking - " + GL20.glGetShaderInfoLog(programID));
}
GL20.glValidateProgram(programID);
if (GL20.glGetProgrami(programID, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) {
System.err.println("Error: Program Validation - " + GL20.glGetShaderInfoLog(programID));
}
}
public abstract void bindAllAttributes();
public void bindAttribute (int index, String location) {
GL20.glBindAttribLocation(programID, index, location);
}
public void bind () {
GL20.glUseProgram(programID);
}
public void destroy () {
GL20.glDetachShader(programID, vertexShaderID);
GL20.glDetachShader(programID, fragmentShaderID);
GL20.glDeleteShader(vertexShaderID);
GL20.glDeleteShader(fragmentShaderID);
GL20.glDeleteProgram(programID);
}
private String readFile (String path) {
BufferedReader reader;
StringBuilder builder = new StringBuilder();
try {
reader = new BufferedReader(new FileReader(path));
String line = reader.readLine();
while (line != null) {
builder.append(line + '\n');
line = reader.readLine();
}
} catch (IOException e) {
System.err.println("Error: Exception while reading from file");
}
return builder.toString();
}
}
public class BasicShader extends Shader {
private static final String VERTEX_FILE = ".\\src\\shaders\\basicVertexShader.vs";
private static final String FRAGMENT_FILE = ".\\src\\shaders\\basicFragmentShader.fs";
public BasicShader() {
super(VERTEX_FILE, FRAGMENT_FILE);
}
@Override
public void bindAllAttributes () {
super.bindAttribute(0, "position");
super.bindAttribute(1, "textCoords");
}
}
我已经测试了着色器文件(basicVertexShader.vs和basicFragmentShader.fs),它们可以正常工作
我尝试了以下方法:
查看是否删除了.dll文件。
重新安装Java(包括jdk和jre)
重新安装Eclipse
将Graohics驱动程序更新到Intel建议的verion
我正在使用Windows10和联想Thinkpad
如果需要任何其他信息,请询问贝娄
更新:
堆栈:[0x0000000002B1000,0x0000000002c10000],sp=0x0000000002c0bf40,可用空间=1007k
本机框架:(J=编译的Java代码,J=解释的,Vv=虚拟机代码,C=本机代码)
C[ig7icd64.dll+0x933b0]
C[ig7icd64.dll+0x17b4b2]
C[ig7icd64.dll+0x215514]
C[ig7icd64.dll+0x6d1ee]
C[ig7icd64.dll+0x243745]
C[ig7icd64.dll+0x92555]
C[ig7icd64.dll+0x2a3af8]
C[ig7icd64.dll+0x2a3e09]
C[ig7icd64.dll+0x2a57ba]
C 0x0000000002d88c67
Java框架:(J=编译的Java代码,J=解释的,Vv=虚拟机代码)
jorg.lwjgl.opengl.GL11C.nglDrawElements(IIIJ)V+0
j org.lwjgl.opengl.GL11C.glpaurements(IIIJ)V+4
j org.lwjgl.opengl.GL11.glpaurements(IIIJ)V+4
j render.Renderer.renderTexturedModel(Lrender/TexturedModel;)V+43(Renderer是一个只执行gl抽屉元素()函数的类;没有什么特别的)
jmain.main.main([Ljava/lang/String;)V+191
v~StubRoutines::调用_stub
更新:
我解决了这个问题。它存在于Model.storeData()中。我没有使用attributeNumber或coordSize.CLOSED[CLOSED]正如您在上次编辑中看到的,我的错误存在于
Model
类中。我实际上没有使用storeData()中的索引
和大小
参数
函数,这意味着我正试图将数组存储在同一个列表中,因此程序崩溃。谢谢大家。请提供一个或至少告诉它崩溃的确切位置(打印到stdout的崩溃报告中提到的hs_err_pid.log文件包含堆栈跟踪)并显示该部分的代码。draw调用中的崩溃在99.9999%是由启用的顶点属性引起的,该属性未通过GLVertexAttributePointer()或赋予glDrawElements()的索引指针正确初始化这是空的。当您使用该方法的长重载而没有绑定GL_元素\u数组\u缓冲区时,可能会发生这种情况。类似的情况将由以下人员捕获和报告:Thank@httpdigest!我刚刚检查了绑定和参数,并弄乱了一些明显的数字。谢谢您的帮助!