gpt4 book ai didi

java - 调用 glGenTextures 时崩溃

转载 作者:行者123 更新时间:2023-12-01 10:05:18 25 4
gpt4 key购买 nike

我一直在尝试创建一个可以打开窗口并能够显示图像的程序(我想制作一个游戏)。由于我之前在 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),位于 pc=0x00007ff9e87ebf60、pid=15984、tid=17180

最佳答案

当然,一旦我发布问题,我就会找到答案。事实证明 ByteBuffers 需要是直接的,所以我必须使用 ByteBuffer.allocateDirect(n) 方法。一旦我更改了所有 ByteBuffer 以指示一切顺利运行。

关于java - 调用 glGenTextures 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36522862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com