LWJGL错误 - 无法找到GL函数的地址glVertexArrayVertexAttribDivisorEXT

问题描述:

我已经在互联网上搜索到了寻找这个问题的答案。我意识到LWJGL3仍然在工作,但没有其他人,但我似乎有这个问题。所以它就是这样,我有一台Mac和一台PC,我喜欢用Java和LWJGL开发,因为它应该是跨平台的。然而,应用在PC上运行得很好,但是当我调试我的Mac上运行它,在我得到这个在控制台:LWJGL错误 - 无法找到GL函数的地址glVertexArrayVertexAttribDivisorEXT

[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。它也运行,但只有在渲染调用时才锁定,导致渲染循环冻结。这里是我的虚拟机参数:

-XstartOnFirstThread -Djava.library.path=lib/ -Dorg.lwjgl.util.Debug=true 

我真的很难找到任何其他职位有同样的问题。我发现一些真正的旧帖子说他们是bug,所以也许这也是。这可能是简单的,我只是愚蠢的,但如果它有帮助,我已经把整个班级列入下面的链接。提前致谢。

满级:http://pastebin.com/eZ1qXPsd

+0

“无法为GL功能定位地址”错误通常是没有什么可担心:他们只是意味着给定功能将无法使用,但如果您没有使用它们,这应该不成问题。 – javac

+0

我建议你用'GLUtil.setupDebugMessageCallback()'设置一个调试消息回调。如果OpenGL出现问题,这将会向控制台输出错误。 – javac

这是被添加到ARB_instanced_arrays扩展它已经在OpenGL驱动程序实现后一个功能。这意味着某些驱动程序可能会公开该扩展,即使该特定功能缺失,因此它已在LWJGL中变为可选。这是来自扩展规范:

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

解决:添加glVertexArrayVertexAttribDivisorEXT选择*
顶点数组对象命令和glGetVertexArrayIntegeri_vEXT查询 必须接受VERTEX_ATTRIB_ARRAY_DIVISOR_ARB返回顶点数组 对象的顶点数组ATTRIB除数状态。加入

的DSA交互2013年七月如果实现
响应一个wglGetProcAddress,为
“glVertexArrayVertexAttribDivisorEXT”用NULL指针等查询时,DSA 功能不可用。

消息:

无法为GL功能 glVertexArrayVertexAttribDivisorEXT

找到地址是在调试模式下简单的警告,可以放心地忽略。如果您需要使用该功能,您可以检查它是否可以使用下面的代码:

// get the extension instance for the current context 
ARBInstancedArrays ext = ARBInstancedArrays.getInstance(); 
if (ext.VertexArrayVertexAttribDivisorEXT != NULL) { 
    // the function is available 
}