2013-03-22 95 views
4

因此我發佈了a question similar to this in stackoverflow,但解決方案似乎可以通過更簡單的解決方案解決。我基本上使用GLEW來加載我的OpenGL頭文件等,沒有麻煩,但由於我使用VIM和Clang_Complete來獲得參數完成,所以我堅持只完成名稱並且讓它沒有實際顯示的參數。由於明顯的功能被定義爲OpenGL替代GLEW的參數已定義或解決方案

#define FOO somefunction 

,而不是定義爲

#define FOO(arg1, arg2, arg3) somefunction(arg1, arg2, arg3) 

我對這個解決方案在我的〜/ .vimrc文件中加入一個選項,並具有完全刪除GLEW,取而代之的是

#define GL_GLEXT_PROTOTYPES 
#include <GL/gl.h> 
#include <GL/glext.h> 

所以,我想知道如果有,做GLEW做什麼,但實際上顯示的參數,或者如果有解決這個使用GLEW辦法GLEW的替代品。

回答

10

爲了充分披露,我寫了以下工具。如果這看起來像廣告,我很抱歉。可以使用OpenGL Loader Generator。這是一個爲加載OpenGL函數生成頭文件和源文件的工具。您可以指定您感興趣的擴展名和OpenGL版本,並且只輸出這些版本的枚舉和函數。這是該工具的主要功能:獲取乾淨的標題和只包含您打算使用的內容的源文件。

但次要的特點是它有不同風格的代。這些樣式定義了輸出如何生成的細節。

standard "pointer_c" style生成的代碼看起來很像GLEW,其功能是#define s。這實際上是C中的必不可少的,因爲您不能重新定義全局可訪問的變量/函數名稱。所以你不能定義一個與非指針函數具有相同名稱的函數指針。如glVertex3f;該名稱在某些平臺上已由OpenGL庫定義,因此您無法定義其新版本。你必須在#define附近。

另一方面,C++具有名稱空間。因此,在the "pointer_cpp" style中,您將獲得將大部分OpenGL放入gl名稱空間的C++頭文件和源代碼。這也意味着指針CPP風格不必使用#defines。所以它沒有。 gl::Vertex3f是一個帶有真實參數類型和名稱的函數指針。任何體面的代碼完成工具應該能夠理解這些。

The "noload_cpp" style做同樣的事情。不同的是,你不需要調用初始化函數;你可以調用任何函數指針,它會動態加載該函數,如果它尚未被加載。

受此討論的啓發,我發佈了一個包含the func_cpp style的工具版本。這使用內聯函數將調用轉發給函數指針。這是直接使用函數,所以如果它不能解析這些,那麼你的自動完成工具就沒有希望了。

+0

所以,如果我使用這個,並使用pointer_cpp風格或noload_cpp風格,我可以得到參數完成與clang_complete?因爲基本上clang_complete的用法是動態叮噹聲,並且只是通過使用編譯器生成完成,這就是爲什麼GLEW不想顯示任何參數完成,因爲它沒有定義任何參數。 – zero57 2013-03-22 11:38:48

+0

@ zero57:我不能*保證*,因爲我從來沒有用過Clang來完成內容。但是這些樣式生成顯式的函數指針,而不是'#define's。所以你有更好的工作機會。對於它的價值來說,VS2008似乎能夠解決這個問題。 – 2013-03-22 11:54:15

+0

所以我嘗試使用OpenGL Loader Generator,但它只是沒有爲我工作,我嘗試了所有樣式,但不幸的是它不想自動完成。不過,我確實喜歡這個主意。它基本上輕鬆地刪除了所有不贊成使用的功能。 – zero57 2013-03-23 02:34:13

0

這是我的解決方案:

#ifdef USE_GLEW 
    #include <GL/glew.h> 
#else 
    #warning "Not using GLEW" 
    #define GL_GLEXT_PROTOTYPES 
    #include <GL/gl.h> 
    #include <GL/glext.h> 
#endif 

和...

​​

然後加入-DUSE_GLFW標誌Makefile文件或CMakeList.txt。但不要加到.ycm_extra_conf.py