我想使用在OpenGL擴展下公開的函數。我在Windows上,我該怎麼做?在Windows上使用OpenGL擴展
回答
硬解: 如果你有一個真正強大的原因不使用GLEW,這裏是如何實現相同:
確定的OpenGL擴展和您希望使用的擴展API。 OpenGL擴展在OpenGL Extension Registry中列出。
例如:我希望使用EXT_framebuffer_object擴展的功能。我想從這個擴展使用的API有:
glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()
檢查,如果你的顯卡支持您要使用的擴展名。如果是這樣,那麼你的工作即將完成!爲您的圖形卡下載並安裝最新的驅動程序和SDK。
示例:我的電腦中的顯卡是NVIDIA 6600 GT。所以,我訪問了NVIDIA OpenGL Extension Specifications網頁,發現支持EXT_framebuffer_object擴展。然後我下載最新的NVIDIA OpenGL SDK並安裝它。
你的圖形卡製造商提供了使用支持的OpenGL擴展所需的所有聲明一個glext.h頭文件(或類似名稱的頭文件)。 (注意並不是所有的擴展都可以被支持。)把這個頭文件放在你的編譯器可以撿起的地方,或者把它的目錄包含在編譯器的include目錄列表中。
在您的代碼中添加一個#include <glext.h>
行以將頭文件包含到您的代碼中。
打開glext.h,找到你想使用和搶API及其相應難看聲明。
例子:我搜索上述幀緩衝的API,找到自己相應的難看聲明:
typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);
所有這一切都意味着,你的頭文件中有2種形式的API聲明。一個是wgl式的醜陋函數指針聲明。另一個是一個理智的功能聲明。
對於您希望使用的每個擴展API,請將函數名稱的代碼聲明添加爲醜陋外觀字符串的類型。
例子:
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
雖然長相醜陋,我們所做的是聲明對應於擴展API類型的函數指針。
用正確的函數初始化這些函數指針。這些功能由圖書館或司機公開。我們需要使用wglGetProcAddress()函數來做到這一點。
例子:
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
不要忘記檢查函數指針NULL。如果碰巧wglGetProcAddress()找不到擴展函數,它會用NULL初始化指針。
例子:
if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
|| NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
// Extension functions not loaded!
exit(1);
}
就是這樣,我們就大功告成了!您現在可以使用這些函數指針,就好像函數調用一樣。
例子:
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);
參考:Moving Beyond OpenGL 1.1 for Windows由戴維·阿瑟爾 - 這篇文章是有點過時,但你要明白爲什麼這個可憐的情況在Windows和存在的所有信息如何繞過它。
@Kronikarz:從外觀上看,GLEW似乎是未來的方式。 NVIDIA已將其與其OpenGL SDK一起發貨。它的最新版本是2007年與2006年的GLEE相比。
但是,這兩個庫的用法看起來幾乎與我相同。 (GLEW有一個init(),但在其他任何事情之前需要調用它。)所以,除非你發現某些擴展在GLEE下不受支持,否則不需要切換。
最新的GLEW版本是從2012年8月6日起的1.9.0。 – 2012-09-01 22:59:53
不使用GLEW的'非常強大的原因'可能是您的編譯器/ IDE不支持該庫。例如:Borland C++ Builder。
在這種情況下,您可能需要從源重建庫。如果它起作用,那麼很好,否則手動擴展加載不會像聲音一樣糟糕。
GL3W是一個公共域腳本,用於創建僅加載OpenGL 3/4的核心功能的庫。它可以在github上找到:
https://github.com/skaslev/gl3w
GL3W需要Python 2。6爲OpenGL生成庫和頭文件;之後它不需要Python。
- 1. 在Windows中的OpenGL霧座標擴展
- 2. 在Windows上使用SQLite的Spatialite擴展
- 3. 啓用OpenGL擴展
- 4. 如何在Android上使用OpenGL ES擴展
- 5. OpenGL擴展的可用性
- 6. OpenGL擴展:如何在OS X下使用它們 - OpenGL新手
- 7. 檢查所有使用的OpenGL擴展
- 8. 有條件地使用OpenGL擴展
- 9. 如何使用OpenGL ARB_gl_spirv擴展?
- 10. 使用glObjectLabel的OpenGL調試擴展
- 11. Windows上的Memcache PHP擴展
- 12. Tegra 3設備上的OpenGL擴展
- 13. 在Windows上獲得〜在.hgrc中擴展
- 14. 如何在Mac OSX上使用distutils使用python C++擴展編譯OpenGL?
- 15. 在Windows上創建node.js本機擴展
- 16. 在Windows上安裝Subversion PECL擴展
- 17. 在Windows上安裝PHP擴展
- 18. 在Windows上編譯Python擴展與Cygwin
- 19. 在Windows上安裝HTTP PECL擴展
- 20. 如何在Windows上創建PHP擴展?
- 21. 在windows上構建PECL擴展
- 22. 在Windows上混合使用OpenGL和GDI
- 23. 在Windows上使用OpenGL ES 2.0入門
- 24. 使用GCC(MinGW)在Windows上編譯OpenGL
- 25. 在Windows上使用XAMPP安裝PHP YAML擴展
- 26. 使用gfortran和MSVC在Windows上構建fortran擴展
- 27. 在Windows上使用Swig和Distutils獲取我的python C++擴展
- 28. PHP擴展不能在Windows上使用Apache
- 29. 在Windows上使用SWIG編譯PHP擴展
- 30. 如何在Android上啓用OpenGL擴展GL_EXT_shader_framebuffer_fetch?
我花了整整一天的時間試圖讓OpenGL與GLEW一起工作,但我一直在遇到問題......只是讓你知道:OpenGL並不是那麼容易設置。但是當它運行時:P – 2014-09-11 14:27:07