Я пытался загрузить и отобразить простую текстуру с помощью lwjgl3, но всякий раз, когда я вызываю glTexImage2D, я получаю EXCEPTION_ACCESS_VIOLATION.
Я сделал небольшой пример, заменив код загрузки красной текстурой 8x8:
Texture.java:
package tabaqui.lwjgl;
import java.nio.ByteBuffer;
import org.lwjgl.opengl.GL11;
public class Texture {
private int id;
private int w;
private int h;
public Texture(ByteBuffer data, int w, int h) {
this.w = w;
this.h = h;
GL11.glEnable(GL11.GL_TEXTURE_2D);
id = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, w, h, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data);
}
public int getId() {
return id;
}
public int getW() {
return w;
}
public int getH() {
return h;
}
}
Game.java:
package tabaqui;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;
import org.lwjgl.system.MemoryStack;
import org.lwjgl.system.MemoryUtil;
import tabaqui.lwjgl.Texture;
public class Game {
private long id;
private Texture t;
public static final String TITLE = "Texture test";
public static final int W = 640;
public static final int H = 480;
public void create() {
int w = 8;
int h = 8;
ByteBuffer bb = ByteBuffer.allocate(w * h * 4);
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++) {
bb.put((byte)0xff); // R
bb.put((byte)0x00); // G
bb.put((byte)0x00); // B
bb.put((byte)0xff); // A
}
bb.flip();
t = new Texture(bb, w, h);
}
public void render() {
// TODO
}
public void dispose() {
GL11.glDeleteTextures(t.getId());
}
public void start() {
// GLFW init
GLFWErrorCallback.createPrint(System.err).set();
if (!GLFW.glfwInit())
throw new RuntimeException("[GLFW] glfwInit error");
GLFW.glfwDefaultWindowHints();
GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);
GLFW.glfwWindowHint(GLFW.GLFW_RESIZABLE, GLFW.GLFW_FALSE);
id = GLFW.glfwCreateWindow(W, H, TITLE, MemoryUtil.NULL, MemoryUtil.NULL);
if (id == MemoryUtil.NULL)
throw new RuntimeException("[GLFW] glfwCreateWindow error");
try (MemoryStack stack = MemoryStack.stackPush()) {
IntBuffer pw = stack.mallocInt(1);
IntBuffer ph = stack.mallocInt(1);
GLFW.glfwGetWindowSize(id, pw, ph);
GLFWVidMode vm = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor());
GLFW.glfwSetWindowPos(id, (vm.width() - pw.get(0)) / 2, (vm.height() - ph.get(0)) / 2);
}
GLFW.glfwMakeContextCurrent(id);
GLFW.glfwSwapInterval(1);
GLFW.glfwShowWindow(id);
// OpenGL init
GL.createCapabilities();
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glViewport(0, 0, W, H);
GL11.glOrtho(0, W, H, 0, 1, -1);
GL11.glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
create();
// Game loop
while (!GLFW.glfwWindowShouldClose(id)) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
render();
GLFW.glfwSwapBuffers(id);
GLFW.glfwPollEvents();
}
dispose();
}
public static void main(String[] args) {
new Game().start();
}
}
Всякий раз, когда я запускаю свою программу, яполучите следующее сообщение:
Среда выполнения Java обнаружила фатальную ошибку:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) при pc = 0x00000000644c34b9, pid = 27816, tid = 12096
Версия JRE: Java (TM) SE Runtime Environment (11.0.1 + 13) (сборка 11.0.1 + 13-LTS) Java VM: Java HotSpot (TM) 64-разрядная серверная виртуальная машина (11.0.1 + 13-LTS,смешанный режим, многоуровневый, сжатый упс, g1 gc, windows-amd64) Проблемный кадр: C [nvoglv64.DLL + 0xd634b9]
Дамп ядра не будет записан.Мини-дампы не включены по умолчанию в клиентских версиях Windows
Файл отчета об ошибке с дополнительной информацией сохраняется как: C: \ Users \ Marco \ eclipse-workspace \ GameLw3 \ hs_err_pid27816.log
Если вы хотите отправить отчет об ошибке, посетите: http://bugreport.java.com/bugreport/crash.jsp Сбой произошел за пределами виртуальной машины Java в собственном коде.См. Проблемный кадр, где можно сообщить об ошибке.
Я что-то упустил?