我想使用OpenGL扩展下公开的函数.我在Windows上,我该怎么做?
简单的解决方案:使用GLEW.看看这里怎么样.
硬解决方案:如果你有一个非常强大的理由不使用GLEW,那么如何在没有它的情况下实现相同的目标:
确定您希望使用的OpenGL扩展和扩展API.OpenGL 扩展注册表中列出了OpenGL扩展.
示例:我希望使用EXT_framebuffer_object扩展的功能.我希望从此扩展中使用的API是:
glGenFramebuffersEXT() glBindFramebufferEXT() glFramebufferTexture2DEXT() glCheckFramebufferStatusEXT() glDeleteFramebuffersEXT()
检查您的图形卡是否支持您要使用的扩展程序.如果确实如此,那么你的工作几乎完成了!下载并安装适用于您的图形卡的最新驱动程序和SDK.
示例:我的PC中的显卡是NVIDIA 6600 GT.因此,我访问了NVIDIA OpenGL扩展规范网页,发现支持EXT_framebuffer_object扩展.然后我下载最新的NVIDIA OpenGL SDK并进行安装.
您的图形卡制造商提供了一个glext.h头文件(或类似命名的头文件),其中包含使用受支持的OpenGL扩展所需的所有声明.(请注意,并非所有扩展都可能受支持.)将此头文件放在编译器可以拾取它的位置或将其目录包含在编译器的include目录列表中.
#include
在代码中添加一行以将头文件包含在代码中.
打开glext.h,找到你想要使用的API并抓住它相应的丑陋声明.
示例:我搜索上面的framebuffer 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);
参考: 由Dave Astle 在Windows上移动OpenGL 1.1 - 这篇文章有点过时了,但是你需要了解为什么在Windows上存在这种可怜的情况以及如何解决它所需的所有信息.