OpenGL的替代方案:具有已定义参数或解决方法的GLEW替代方案

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 的情况下解决这个问题。

2个回答

11

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

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

但是,该工具的次要特性是它具有不同的生成样式。这些样式定义了输出生成的具体规范。

标准“pointer_c”样式生成的代码非常类似于GLEW,其中函数是#defines。在C中,这实际上是必要的,因为您无法重新定义全局可访问的变量/函数名称。因此,您无法定义与非指针函数具有相同名称的函数指针。例如glVertex3f;该名称已在某些平台上由OpenGL库定义,因此您无法定义其新版本。您必须#define around它。

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

“noload_cpp”风格与此相同,但不需要调用初始化函数,您可以调用任何函数指针,如果该函数尚未加载,则动态加载它。

受此讨论的推动,我发布了一个版本的工具,其中包括func_cpp风格。这使用内联函数将调用转发到函数指针。这直接使用函数,所以如果无法解析这些内容,则您的自动补全工具就没有希望了。


@zero57:如果它不能基于函数指针自动完成,则没有任何加载器可以工作。好吧,我想你可以编写一个。您可以修改pointer_cpp样式,使函数指针位于不同的命名空间中,并且函数本身是内联函数,将参数转发到实际指针。或者,您可以停止使用糟糕的自动完成工具。实际上,如果它不能基于函数指针自动完成,那有什么用呢? - Nicol Bolas
抱歉,我不喜欢使用IDE,我喜欢使用Vim,但被迫坚持使用它,并且只有在定义GL_GLEXT_PROTOTYPES之后才能获得参数完成。此外,我甚至没有使用扩展,而是使用原始函数,如glBindBuffer和GLEW,你的加载器甚至不能提供参数完成。只有通过定义GL_GLEXT_PROTOTYPES并包含这些头文件,我才能看到参数。我的意思是,如果我必须忍受这个问题,那还好,但我认为应该有一些解决方法,而不是不得不从VIM切换到IDE。 - zero57
@zero57:我并没有提到使用集成开发环境(IDE)。我说的是要使用一个更好的自动补全工具。如果这个“clang_complete”工具连函数指针都无法自动补全,那么很有可能你会遇到其他它无法处理的情况。它可能会给你带来问题,所以最好放弃它,选择其他工具。我非常怀疑“clang_complete”是VIM上唯一可用的自动补全工具。 - Nicol Bolas
好的,它只是显示函数,没有其他的。我所做的就是包含创建的cpp和hpp文件。我使用“lua LoadGen.lua -style=pointer_cpp -spec=gl -version=3.3 -profile=core core_3_3”生成了我的文件。我没有添加任何链接器选项或其他内容,我完全按照我在这里所述的方式操作,当我键入“gl :: BindBuffer”时,我看到的只是BindBuffer v PFNBINDBUFFER,没有更多,也没有更少。里面没有参数。我做错了什么吗?还有,当你说在Windows上定义原型不起作用时,使用你的glLoadGen(以及其他工具如GLEW)会在其他平台上起作用吗? - zero57
抱歉,我不明白,但为什么要定义与现有函数同名的宏?听起来很愚蠢。 - luke1985
显示剩余19条评论

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

然后在 Makefile 或 CMakeList.txt 中加入 -DUSE_GLFW 标志。但是不要将其添加到 .ycm_extra_conf.py 文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接