在 Windows 上使用 OpenGL 扩展
我想使用 OpenGL 扩展下公开的功能。 我使用的是 Windows,我该怎么做?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想使用 OpenGL 扩展下公开的功能。 我使用的是 Windows,我该怎么做?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
简单的解决方案:使用GLEW。 请参阅此处。
硬解:
如果您有非常充分的理由不使用 GLEW,可以通过以下方法在不使用 GLEW 的情况下实现相同的目的:
识别 OpenGL 扩展以及您希望使用的扩展 API。 OpenGL 扩展列在OpenGL 扩展注册表中。
检查您的图形卡是否支持您希望使用的扩展。 如果是的话,那么你的工作就快完成了! 下载并安装适用于您的显卡的最新驱动程序和 SDK。
您的图形卡制造商提供了一个 glext.h 头文件(或类似名称的头文件),其中包含使用受支持的 OpenGL 扩展所需的所有声明。 (请注意,并非所有扩展都受支持。)要么将此头文件放置在编译器可以拾取的位置,要么将其目录包含在编译器的包含目录列表中。
在代码中添加
#include
行以将头文件包含到代码中。打开glext.h,找到您想要使用的 API 并获取其相应的丑陋声明。
这意味着您的头文件具有两种形式的 API 声明。 一种是类似 wgl 的丑陋的函数指针声明。 另一个是看起来正常的函数声明。
对于您想要使用的每个扩展 API,将函数名称的代码声明添加为丑陋的字符串类型。
虽然看起来很丑,但我们所做的只是声明与扩展 API 对应类型的函数指针。
用它们正确的函数初始化这些函数指针。 这些函数由库或驱动程序公开。 我们需要使用wglGetProcAddress()函数来做到这一点。
不要忘记检查函数指针是否为 NULL。 如果wglGetProcAddress()碰巧找不到扩展函数,它就会用NULL初始化指针。
就这样,我们完成了! 您现在可以使用这些函数指针,就像函数调用存在一样。
参考: 超越适用于 Windows 的 OpenGL 1.1 作者:Dave Astle — 这篇文章有点过时,但包含了您需要了解为什么 Windows 上存在这种可悲情况以及如何解决它所需的所有信息。
Easy solution: Use GLEW. See how here.
Hard solution:
If you have a really strong reason not to use GLEW, here's how to achieve the same without it:
Identify the OpenGL extension and the extension APIs you wish to use. OpenGL extensions are listed in the OpenGL Extension Registry.
Check if your graphic card supports the extension you wish to use. If it does, then your work is almost done! Download and install the latest drivers and SDKs for your graphics card.
Your graphic card manufacturer provides a glext.h header file (or a similarly named header file) with all the declarations needed to use the supported OpenGL extensions. (Note that not all extensions might be supported.) Either place this header file somewhere your compiler can pick it up or include its directory in your compiler's include directories list.
Add a
#include <glext.h>
line in your code to include the header file into your code.Open glext.h, find the API you wish to use and grab its corresponding ugly-looking declaration.
All this means is that your header file has the API declaration in 2 forms. One is a wgl-like ugly function pointer declaration. The other is a sane looking function declaration.
For each extension API you wish to use, add in your code declarations of the function name as a type of the ugly-looking string.
Though it looks ugly, all we're doing is to declare function pointers of the type corresponding to the extension API.
Initialize these function pointers with their rightful functions. These functions are exposed by the library or driver. We need to use wglGetProcAddress() function to do this.
Don't forget to check the function pointers for NULL. If by chance wglGetProcAddress() couldn't find the extension function, it would've initialized the pointer with NULL.
That's it, we're done! You can now use these function pointers just as if the function calls existed.
Reference: Moving Beyond OpenGL 1.1 for Windows by Dave Astle — The article is a bit dated, but has all the information you need to understand why this pathetic situation exists on Windows and how to get around it.
不使用 GLEW 的一个“非常充分的理由”可能是您的编译器/IDE 不支持该库。 例如:Borland C++ Builder。
在这种情况下,您可能需要从源代码重建库。 如果它有效,那就太好了,否则手动扩展加载并不像听起来那么糟糕。
A 'Very strong reason' not to use GLEW might be that the library is not supported by your compiler/IDE. E.g: Borland C++ Builder.
In that case, you might want to rebuild the library from source. If it works, great, otherwise manual extension loading isnt as bad as it is made to sound.
@Kronikarz:从表面上看,GLEW 似乎是未来的方向。 NVIDIA 已将其与 OpenGL SDK 一起提供。 它的最新版本是 2007 年,而 GLEE 是 2006 年。
但是,在我看来,这两个库的用法几乎相同。 (GLEW 有一个 init(),需要在其他任何事情之前调用它。)因此,除非您发现 GLEE 不支持某些扩展,否则您不需要切换。
@Kronikarz: From the looks of it, GLEW seems to be the way of the future. NVIDIA already ships it along with its OpenGL SDK. And its latest release was in 2007 compared to GLEE which was in 2006.
But, the usage of both libraries looks almost the same to me. (GLEW has an init() which needs to be called before anything else though.) So, you don't need to switch unless you find some extension not being supported under GLEE.
GL3W 是一个公共域脚本,它创建一个仅加载 OpenGL 3/4 核心功能的库。 它可以在 github 上找到:
https://github.com/skaslev/gl3w
GL3W 需要 Python 2.6生成 OpenGL 的库和标头; 之后就不需要Python了。
GL3W is a public-domain script that creates a library which loads only core functionality for OpenGL 3/4. It can be found on github at:
https://github.com/skaslev/gl3w
GL3W requires Python 2.6 to generate the libraries and headers for OpenGL; it does not require Python after that.