我一直在尝试创建一个可以打开窗口并能够显示图像的程序(我想制作游戏)。因为我之前在C ++中使用过OGL,这次我决定学习一些Java并获得自己的LWJGL。我在官方教程的帮助下设置了窗口,一切都很好。但是当我尝试加载纹理时,我遇到了崩溃。该程序在调用glGenTextures时不断崩溃。我见过很多类似的问题,大多数答案是线程缺乏上下文,但我也设置了它。这是我用来加载图片的代码:
public Image(String path) {
this();
try {
InputStream in = new FileInputStream(path);
try {
PNGDecoder decoder = new PNGDecoder(in);
ByteBuffer buf = ByteBuffer.allocateDirect(4*decoder.getWidth()*decoder.getHeight());
decoder.decode(buf, decoder.getWidth()*4, Format.RGBA);
buf.flip();
ByteBuffer TextureNameGen = ByteBuffer.allocate(8);
glGenTextures(1, TextureNameGen); //<-- This is where the program crashes
TextureID = TextureNameGen.getInt();
ByteBuffer boundTexture = ByteBuffer.allocate(8);
glGetIntegerv(GL_TEXTURE_BINDING_2D, boundTexture);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glBindTexture(GL_TEXTURE_2D, boundTexture.getInt());
Width = decoder.getWidth();
Height = decoder.getHeight();
} finally {
in.close();
}
list.add(this);
} catch (Exception e) {
//Do nothing
}
}
以下是我设置窗口和上下文的方法:
private void init() {
//Setup an error callback
glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err));
//Initialize GLFW
if ( glfwInit() != GLFW_TRUE )
throw new IllegalStateException("Unable to initialize GLFW");
//Create the window
window = glfwCreateWindow(WIDTH, HEIGHT, "RopeProject", NULL, NULL);
if ( window == NULL )
throw new RuntimeException("Failed to create the GLFW window");
//Setup a key callback
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
Controls.instance.pushCommand(key, action);
}
}
);
//Get the resolution of the primary monitor
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
//Center our window
glfwSetWindowPos(window, (vidmode.width() - WIDTH) / 2, (vidmode.height() - HEIGHT) / 2);
//Make the OpenGL context current
glfwMakeContextCurrent(window);
// Enable v-sync
glfwSwapInterval(1);
//Essential
GL.createCapabilities();
//GL Attributes
glViewport(0, 0, WIDTH, HEIGHT);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glLoadIdentity();
new Image("./gfx/Test.png"); //<-- Here is where I try to load up the texture.
PhysicsThread.instance.start();
}
我错过了一些明显的东西吗?难道我做错了什么?过去6个小时我一直在这里,我似乎无法找到答案。如果要提供帮助,我可以提供崩溃日志。他们都这么说:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff9e87ebf60, pid=15984, tid=17180
答案 0 :(得分:1)
当然,一旦我发布问题,我就会找到答案。事实证明,ByteBuffers需要是直接的,所以我不得不使用ByteBuffer.allocateDirect(n)
方法。一旦我改变了所有的ByteBuffers,直接指向一切顺利。