16

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

4

4 回答 4

21

简单的解决方案:使用GLEW。看看这里如何。

困难的解决方案:如果你有一个非常充分的理由不使用 GLEW,下面是如何在没有它的情况下实现相同的目标:

确定您希望使用的 OpenGL 扩展和扩展 API。OpenGL 扩展名列在OpenGL Extension Registry中。

示例:我希望使用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 <glext.h>一行以将头文件包含到代码中。

打开glext.h,找到你想要使用的 API 并获取其对应的丑陋声明。

示例:我搜索上述帧缓冲区 API 并找到它们对应的丑陋声明:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

这意味着你的头文件有两种形式的 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 上存在这种可悲情况以及如何解决它所需的所有信息。

于 2008-08-18T10:12:00.577 回答
3

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

在这种情况下,您可能希望从源代码重建库。如果它有效,那就太好了,否则手动扩展加载并不像听起来那么糟糕。

于 2009-04-19T12:01:59.477 回答
0

@Kronikarz:从外观上看,GLEW似乎是未来的道路。NVIDIA 已经将它与它的OpenGL SDK一起提供。与 2006 年的 GLEE 相比,它的最新版本是 2007 年。

但是,在我看来,这两个库的用法几乎相同。(GLEW 有一个init()需要在其他任何事情之前调用。)因此,除非您发现 GLEE 不支持某些扩展,否则您不需要切换。

于 2008-08-20T03:01:42.273 回答
0

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

https://github.com/skaslev/gl3w

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

于 2012-03-26T04:05:43.760 回答