调用glGenTextures

时间:2016-04-09 21:21:47

标签: java opengl lwjgl

我一直在尝试创建一个可以打开窗口并能够显示图像的程序(我想制作游戏)。因为我之前在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

1 个答案:

答案 0 :(得分:1)

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