3

所以我在stackoverflow中发布了一个与此类似的问题,但解决方案似乎可以通过更简单的解决方案来解决。

基本上,我使用 GLEW 来加载我的 OpenGL 头文件等,没有任何麻烦,但是由于我使用 VIM 和 Clang_Complete 来完成参数,所以我坚持只完成名称并且没有实际显示的参数. 因为显然函数被定义为

#define FOO somefunction

并且没有定义为

#define FOO(arg1, arg2, arg3) somefunction(arg1, arg2, arg3)

我对此的解决方案是在我的 ~/.vimrc 文件中添加一个选项,并且必须完全删除 GLEW 并将其替换为

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

所以,我想知道是否有 GLEW 的替代品可以做 GLEW 的工作,但实际上显示了参数,或者是否有办法使用 GLEW 解决这个问题。

4

2 回答 2

11

为了充分披露,我编写了以下工具。如果这读起来像广告,我深表歉意。

您可以使用OpenGL 加载器生成器。它是一个生成用于加载 OpenGL 函数的头文件和源文件的工具。您指定您感兴趣的扩展和 OpenGL 版本,它只输出这些版本的枚举和函数。这是该工具的主要功能:获取仅包含您打算使用的内容的干净头文件和源文件。

但次要特征是它具有不同的生成风格。这些样式定义了如何生成输出的细节。

标准的“pointer_c”样式生成的代码看起来很像 GLEW,其中的函数是#defines。这在 C 中实际上是必不可少的,因为您无法重新定义全局可访问的变量/函数名称。所以你不能定义一个与非指针函数同名的函数指针。如glVertex3f; 该名称已由某些平台上的 OpenGL 库定义,因此您无法定义它的新版本。你必须#define绕过它。

另一方面,C++ 有命名空间。因此,在 "pointer_cpp" 样式中,您会获得将大部分 OpenGL 放在gl命名空间中的 C++ 标头和源代码。这也意味着指针 CPP 样式不必使用#defines。所以它没有。gl::Vertex3f是具有实参类型和名称的函数指针。任何体面的代码完成工具都应该能够理解这些。

“noload_cpp”样式做同样的事情。不同之处在于您不必调用初始化函数;您可以调用任何函数指针,如果尚未加载该函数,它将动态加载该函数。

受此讨论的启发,我发布了包含func_cpp 样式的工具版本。这使用内联函数将调用转发到函数指针。这是直接使用函数,所以如果它不能解析这些,那么你的自动完成工具就没有希望了。

于 2013-03-22T01:23:07.813 回答
1

这是我的解决方案:

#ifdef USE_GLEW
    #include <GL/glew.h>
#else
    #warning "Not using GLEW"
    #define GL_GLEXT_PROTOTYPES
    #include <GL/gl.h>
    #include <GL/glext.h>
#endif

和...

// Initialize GLEW
#ifdef USE_GLEW
    glewExperimental = GL_TRUE;
    if (glewInit())
    {
        fprintf(stderr, "Failed to initialize GLEW.\n");
    }
#endif

然后将-DUSE_GLFW标志添加到 Makefile 或 CMakeList.txt。但不要添加到 .ycm_extra_conf.py

于 2014-08-05T17:18:29.157 回答