我想使用OpenGL扩展下公开的函数。我在Windows上,我该怎么做?
答案 0 :(得分:20)
硬解决方案: 如果你有非常强大的理由不使用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并安装它。
您的图形卡制造商提供了 glext.h 头文件(或类似命名的头文件),其中包含使用支持的OpenGL扩展所需的所有声明。 (请注意,并非所有扩展都可能受支持。)将此头文件放在编译器可以拾取它的位置或将其目录包含在编译器的include目录列表中。
在代码中添加#include <glext.h>
行,将头文件包含在代码中。
打开 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的参考: Moving Beyond OpenGL 1.1 for Windows - 这篇文章有点过时了,但是您需要了解为什么在Windows上存在这种可怜的情况以及如何解决它所需的所有信息
答案 1 :(得分:3)
不使用GLEW的“非常强烈的理由”可能是您的编译器/ IDE不支持该库。例如:Borland C ++ Builder。
在这种情况下,您可能希望从源重建库。如果它工作,那么很好,否则手动扩展加载并不像发出声音一样糟糕。
答案 2 :(得分:0)
@Kronikarz:从它的外观来看, GLEW 似乎是未来的方式。 NVIDIA已将其与 OpenGL SDK 一起发布。它的最新版本是在2007年与2006年的GLEE相比。
但是,两个库的使用对我来说几乎都是一样的。 (GLEW有一个 init(),它需要在其他任何事情之前调用。)所以,除非你发现GLEE不支持某些扩展,否则你不需要切换。
答案 3 :(得分:0)
GL3W是一个公共域脚本,它创建一个只加载OpenGL 3/4核心功能的库。它可以在github上找到:
https://github.com/skaslev/gl3w
GL3W要求Python 2.6为OpenGL生成库和头文件;之后它不需要Python。