我在互联网上搜索了很多遍,寻找这个问题的答案。我意识到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,所以也许这也是。这可能很简单,我只是很笨,但如果有帮助的话,我已经在下面的链接中包含了整个类。提前谢谢。
全类:http://pastebin.com/eZ1qXPsd
这是一个在OpenGL驱动程序中实现后添加到ARB_instanced_arrays扩展中的函数。这意味着,即使缺少特定的功能,一些驱动程序也可能会公开扩展,因此它在LWJGL中是可选的。这是来自扩展规范:
7) EXT_direct_state_access应该如何与此扩展交互?
已解决:添加glVertexArrayVertexAttribDivisorEXT选择器免费
顶点数组对象命令和glGetVertexArrayIntegeri_vEXT查询必须接受VEREX_ATTRIB_ARRAY_DIVISOR_ARB才能返回顶点数组对象的顶点属性数组除数状态。DSA交互于2013年7月添加。如果实现
响应
的wglGetProcAddress等查询具有NULL指针的"glVertexArrayVertexAttribDivisorEXT",DSA功能不可用。
信息:
未能找到总账功能的地址glVertexArrayVertexAttribDivisorEXT
在调试模式下是一个简单的警告,可以安全地忽略。如果你需要使用该功能,你可以使用以下代码检查它是否可用:
// get the extension instance for the current context
ARBInstancedArrays ext = ARBInstancedArrays.getInstance();
if ( ext.VertexArrayVertexAttribDivisorEXT != NULL ) {
// the function is available
}