Java LWJGL错误-找不到GL函数glVertexArrayVertexAttribDivisorEXT的地址

Java LWJGL错误-找不到GL函数glVertexArrayVertexAttribDivisorEXT的地址,java,multithreading,macos,opengl,lwjgl,Java,Multithreading,Macos,Opengl,Lwjgl,我在互联网上到处搜寻,寻找这个问题的答案。我意识到LWJGL3仍在工作中,但除了我之外,似乎没有其他人有这个问题。我有一台Mac和一台PC,我喜欢用Java和LWJGL开发,因为它应该是跨平台的。然而,该应用程序在PC上运行正常,但当我在Mac上运行它并进行调试时,我会在控制台中看到: [LWJGL] Version 3.0.0b build 35 | Mac OS X | x86_64 [LWJGL] Loaded library from java.library.path: lwjgl [

我在互联网上到处搜寻,寻找这个问题的答案。我意识到LWJGL3仍在工作中,但除了我之外,似乎没有其他人有这个问题。我有一台Mac和一台PC,我喜欢用Java和LWJGL开发,因为它应该是跨平台的。然而,该应用程序在PC上运行正常,但当我在Mac上运行它并进行调试时,我会在控制台中看到:

[LWJGL] Version 3.0.0b build 35 | Mac OS X | x86_64
[LWJGL] Loaded library from java.library.path: lwjgl
[LWJGL] MemoryUtil accessor: MemoryAccessorUnsafe
[LWJGL] Loaded native library: lib/libjemalloc.dylib
[LWJGL] MemoryUtil allocator: JEmallocAllocator
[LWJGL] Loaded native library: lib/libglfw.dylib
[LWJGL] Loaded native library bundle: /System/Library/Frameworks/OpenGL.framework
[LWJGL] Failed to locate address for GL function glVertexArrayVertexAttribDivisorEXT
我相信“定位失败…”发生在GL.createCapabilities()调用期间。因此,我认为这使得OpenGL初始化失败,只是创建了一个空白屏幕,因为这似乎是发生在我身上的事情

以下是实际代码:

        glfwSetErrorCallback(errorCallback = errorCallbackPrint(System.err));

        if (glfwInit() != GL11.GL_TRUE)
            throw new IllegalStateException("Unable to initialize GLFW");

        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
        glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

        ByteBuffer vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
        WIDTH = GLFWvidmode.width(vidmode);
        HEIGHT = GLFWvidmode.height(vidmode);
        RENDER_RATIO = (float) WIDTH / 1920.0f; // Scales all the rendering by a constant

        window = glfwCreateWindow(WIDTH, HEIGHT, "Game", glfwGetPrimaryMonitor(), NULL);
        if (window == NULL)
            throw new RuntimeException("Failed to create the GLFW window");

        // GLFW Callbacks
        glfwSetKeyCallback(window, keyCallback = new Keyboard());
        glfwSetCursorPosCallback(window, cursorPosCallback = new Mouse.CursorPos());
        glfwSetMouseButtonCallback(window, mouseButtonCallback = new Mouse.MouseButton());
        glfwSetScrollCallback(window, scrollCallback = new Mouse.Scroll());

        glfwMakeContextCurrent(window);
        glfwSwapInterval(1);
        glfwShowWindow(window);

        // Initialize OpenGL
        GL.createCapabilities(); //New for LWJGL 3.0.0b
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glClearColor(1f, 0f, 0f, 1.0f); //Red background
窗口会初始化,但我猜OpenGL上下文不会,因为当我将背景设置为红色时,窗口是黑色的。在此之前,我遇到了“未在主线程上启动”异常,但通过在VM参数中添加-XstartOnFirstThread来修复这些异常。这是一个多线程的游戏循环,但我确保在主线程上进行渲染,并在新线程上进行更新,但是由于没有正确初始化OpenGL,所以它甚至没有达到这一步。它也会运行,但仅在到达渲染调用时才会锁定,从而导致渲染循环冻结。以下是我的VM参数:

-XstartOnFirstThread -Djava.library.path=lib/ -Dorg.lwjgl.util.Debug=true
我真的很难找到其他有同样问题的帖子。我发现一些很老的帖子说它们是bug,所以也许这也是。这可能是一些简单的事情,我只是在装傻,但如果它有帮助的话,我已经在下面的链接中包含了整个类。提前谢谢


完整类:

这是一个在OpenGL驱动程序中实现后添加到扩展中的函数。这意味着某些驱动程序可能会公开扩展,即使该特定函数丢失,因此在LWJGL中它是可选的。这来自扩展规范:

7) EXT_direct_state_access应如何与此扩展交互

已解决:添加GlvertexArrayVertexAttributeDivisor下一个选择器自由
顶点数组对象命令和glGetVertexArrayIntegeri_vEXT查询 必须接受顶点属性数组除数来返回顶点 数组对象的顶点属性数组除数状态

DSA交互于2013年7月添加。如果实现
响应wglGetProcAddress等。查询
带有空指针的“GLVERTEXARRAYVERTEXATTributeDivisionOrExt”,DSA 功能不可用

信息:

未能找到总账功能的地址 GLVertexArrayVertexAttributeDivisionOrExt

是调试模式下的一个简单警告,可以安全地忽略。如果需要使用该功能,可以使用以下代码检查该功能是否可用:

//获取当前上下文的扩展实例
ArbInstanceArrays ext=ArbInstanceArrays.getInstance();
如果(ext.VertexArrayVertexAttributeDivisionExt!=NULL){
//该功能可用
}

通常不必担心“未能找到GL函数的地址”错误:它们只是意味着给定的函数将不可用,但如果您不使用它们,这应该不是问题。我建议您使用
GLUtil.setupDebugMessageCallback()
设置调试消息回调。如果OpenGL出现问题,这将向控制台打印错误。