OpenGL GLX_EXT_swap_control 存在但无法链接函数

Baz*_*kum -1 c++ opengl nvidia cmake

我无法在代码中使用 glXSwapBufferEXT,我得到未声明的标识符。但例如 glXQueryDrawable 可以工作。

在我的 cmake 文件中,我链接了 Opengl 库,并将它们包含在编译器中。

在我的标题中,我包括 GL/glx.h 和 GL/glxext.h。

运行 glxinfo 显示 GLX_EXT_swap_control 存在,并且在我的应用程序中测试扩展也显示它在运行时存在。

我究竟做错了什么?我错过了什么吗?

我为 Quadro K5000 安装了 NVIDIA 346.47 驱动程序

Linux gcc4.9/clang3.5

der*_*ass 5

您必须使用扩展机制在运行时查询函数指针,尝试直接链接到 glX 扩展函数并不能保证有效。

请注意,我假设您想要glXSwapIntervalEXT而不是 the glXSwapBufferEXT,因为后者不存在,而前者是 中定义的唯一函数GLX_EXT_swap_control,所以您可能是这个意思。

如果您想手动执行此操作,您应该从 opengl.org获取最新的glxext.h指针类型定义PFNGLXSWAPINTERVALEXTPROC,并像这样使用它:

#include "glxext.h"

/* function pointer for glXSwapIntervalEXT */
PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT=NULL;

/* later in your code */
if (/* GLX_EXT_swap_control supported */) {
   glXSwapIntervalEXT=(PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
}

/* Later, you can use it as if it were a function.
   You'll need a GL context for that */
glXSwapIntervalEXT(1);
Run Code Online (Sandbox Code Playgroud)

然而,手动执行此操作会添加大量样板代码。您应该考虑使用像GLEW这样的OpenGL 加载库,除了 GL 扩展之外,它还可以处理和扩展,并在幕后为您完成所有这些工作。glXwgl