OpenGL GLX_EXT_swap_control存在但无法链接功能

时间:2015-03-02 18:59:18

标签: c++ opengl cmake nvidia

我无法在我的代码中使用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

1 个答案:

答案 0 :(得分:4)

您必须使用扩展机制在运行时查询函数指针,尝试直接链接到glX 扩展功能无法保证正常工作。

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

如果您想手动执行此操作,则应抓取latest glxext.h from opengl.org以获取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);

但是,手动执行此操作会添加许多样板代码。您应该考虑使用OpenGL loading library之类的GLEW,除了GL扩展外,它还可以处理glXwgl扩展,并为您完成所有这些工作。