2015-11-04 46 views
1

我已經在互聯網上搜索到了尋找這個問題的答案。我意識到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

回答

1

這是被添加到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 
}