题 在Windows上使用OpenGL扩展


我想使用OpenGL扩展下公开的函数。我在Windows上,我该怎么做?


16
2017-08-18 10:11


起源




答案:


轻松解决方案: 使用 GLEW。怎么看 这里

硬解决方案: 如果你有 真的很有道理 不使用GLEW,如果没有它,如何实现相同:

确定您希望使用的OpenGL扩展和扩展API。 OpenGL扩展列在 OpenGL扩展注册表

示例:我希望使用的功能 EXT_framebuffer_object 延期。我希望从此扩展中使用的API是:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

检查您的图形卡是否支持您要使用的扩展程序。如果确实如此,那么你的工作几乎完成了!下载并安装适用于您的图形卡的最新驱动程序和SDK。

示例:我的电脑中的显卡是 NVIDIA 6600 GT。所以,我访问了 NVIDIA OpenGL扩展规范 网页,找到了 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");

不要忘记检查函数指针 空值。如果是偶然的 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);

参考:  超越OpenGL 1.1 for Windows 作者:Dave Astle - 这篇文章有点过时了,但是你需要了解为什么在Windows上存在这种可悲的情况以及如何解决它所需的所有信息。


19
2017-08-18 10:12



我花了一整天的时间试图让OpenGL与GLEW一起工作,但我一直遇到问题......就这样你知道:OpenGL设置起来并不容易。但是当它运行时:P - Christian Veenman


不使用GLEW的“非常强大的理由”可能是您的编译器/ IDE不支持该库。例如:Borland C ++ Builder。

在这种情况下,您可能希望从源重建库。如果它工作,很好,否则手动扩展加载并不像声音那样糟糕。


3
2018-04-19 12:01





@Kronikarz:从它的外观来看, GLEW 似乎是未来的方式。 NVIDIA已将其与其一起发售 OpenGL SDK。它的最新版本是在2007年与2006年的GLEE相比。

但是,这两个库的使用对我来说几乎是一样的。 (GLEW有一个 在里面() 这需要在其他任何事情之前进行调用。)因此,除非您发现某些扩展在GLEE下不受支持,否则您无需切换。


0
2017-08-20 03:01



最新的GLEW版本是2012年8月6日的1.9.0。 - Lars Pensjö
从2015年1月26日开始,最新的GLEW版本现在是1.12.0。所以它显然得到了积极的支持:) - iondune


GL3W是一个公共域脚本,它创建一个只加载OpenGL 3/4核心功能的库。它可以在github上找到:

https://github.com/skaslev/gl3w

GL3W需要Python 2.6来为OpenGL生成库和头文件;之后它不需要Python。


0
2018-03-26 04:05