Моя программа падает из-за EXCEPTION_ACCESS_VIOLATION
в файле ig7icd64.dll
file.
Я создаю простой проект с библиотекой LWJGL и некоторыми внешними банками, найденными здесь: https://github.com/CodingAP/LWJGL-3-Tutorial.git (просто используя slick-util3) и при загрузке текстур из файлов ресурсов ('.png') программа вылетает.
У меня есть много классов, которые используют много GLXX.gl [имя_функции_ здесь], но яобъясню, почему я не перечисляю их все.
Я создаю окно с классом Window, который просто устанавливает GLFW-контекст и работает просто отлично.
У меня есть класс Model, которыйрасширяется UntexturedModel, а также TexturedModel.Они устанавливают VertexArrays и VertexBuffers и работают нормально.У меня даже есть класс Shader, который читает два файла шейдеров и применяет их без ошибок.
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
}
Это расширяет класс Model следующим образом:
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);Он также имеет атрибут Material, который использует внешние jar-файлы:
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, рекомендованной Intel
Я использую Windows 10 и Lenovo Thinkpad.
Если есть какая-либо дополнительная информациянеобходимо, пожалуйста, спросите ниже.
Обновление:
Стек: [0x0000000002b10000,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
10* Java-фреймы: (J = скомпилированный Java-код, j = интерпретированный, Vv = VM-код)
j org.lwjgl.opengl.GL11C.nglDrawElements (IIIJ) V + 0
j org.lwjgl.opengl.GL11C.glDrawElements (IIIJ) V + 4
j org.lwjgl.opengl.GL11.glDrawElements (IIIJ) V + 4
j render.Renderer.renderTexturedModel (Lrender / TexturedModel;) V + 43(Renderer - это класс, который просто выполняет функцию glDrawElements ();ничего особенного)
j main.Main.main ([Ljava / lang / String;) V + 191
v ~ StubRoutines :: call_stub
Обновление: я решилвопрос.Он лежит в Model.storeData ().Я не использую attributeNumber илиordinSize.ЗАКРЫТО