硬解决方案:
如果你有一个非常强的理由不使用GLEW,这里是如何实现相同的没有它:
识别您希望使用的OpenGL扩展和扩展API。 OpenGL扩展在OpenGL Extension Registry中列出。
Example: I wish to use the capabilities of the 07003 extension. The APIs I wish to use from this extension are:
glGenFramebuffersEXT() glBindFramebufferEXT() glFramebufferTexture2DEXT() glCheckFramebufferStatusEXT() glDeleteFramebuffersEXT()
检查您的图形卡是否支持您希望使用的分机。如果是,那么你的工作几乎完成了!下载并安装您的显卡的最新驱动程序和SDK。
Example: The graphics card in my PC is a NVIDIA 6600 GT. So,I visit the 07004 webpage and find that the 07005 extension is supported. I then download the latest 07006 and install it.
您的图形卡制造商提供了一个glext.h头文件(或类似的命名头文件),其中包含使用支持的OpenGL扩展所需的所有声明。 (请注意,并不是所有的扩展名都可能被支持。)将这个头文件放在某个地方,你的编译器可以把它或者把它的目录包含在编译器的include目录列表中。
添加#include< glext.h>在您的代码中包含头文件到您的代码。
打开glext.h,找到您希望使用的API,并抓取其相应的丑陋的声明。
Example: I search for the above framebuffer APIs and find their corresponding ugly-looking declarations:
typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n,GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei,GLuint *);
所有这些意味着您的头文件具有2种形式的API声明。一个是一个wgl般的丑陋的函数指针声明。另一个是一个理智的功能声明。
对于要使用的每个扩展API,将函数名的代码声明添加为丑陋的字符串的类型。
Example:
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
虽然看起来很丑,但我们所做的就是声明与扩展API相对应的类型的函数指针。
初始化这些函数指针与其正确的功能。这些功能由库或驱动程序公开。我们需要使用wglGetProcAddress()函数来做到这一点。
Example:
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT"); glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT"); glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT"); glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT"); glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
不要忘记检查函数指针为NULL。如果偶然地wglGetProcAddress()找不到扩展函数,那么它将初始化为NULL的指针。
Example:
if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT) { // Extension functions not loaded! exit(1); }
就这样,我们完成了!现在可以使用这些函数指针,就像函数调用存在一样。
Example:
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 by Dave Astle – 这篇文章有点过时了,但是您需要了解所有的信息,以了解为什么Windows可能存在这种可疑情况以及如何解决这个问题。