有人试过使用glMultiDrawArraysIndirect吗?编译器找不到该功能

时间:2013-11-14 23:12:51

标签: c++ opengl

有没有人成功使用过glMultiDrawArraysIndirect?我包括最新的glext.h但编译器似乎无法找到该函数。在包含glext.h之前,我是否需要定义一些内容(#define ...)?

    error: ‘GL_DRAW_INDIRECT_BUFFER’ was not declared in this scope
    error: ‘glMultiDrawArraysIndirect’ was not declared in this scope

我正在尝试实现OpenGL superBible示例。以下是源代码的片段:

    GLuint indirect_draw_buffer;
    glGenBuffers(1, &indirect_draw_buffer);
    glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirect_draw_buffer);
    glBufferData(GL_DRAW_INDIRECT_BUFFER,
             NUM_DRAWS * sizeof(DrawArraysIndirectCommand),
             draws,
             GL_STATIC_DRAW);
    ....
    // fill the buffers
    ..... 
    glMultiDrawArraysIndirect (GL_TRIANGLES,  NULL, 3, 0);

我使用的是Quadro 2000&安装了最新的驱动程序(NVidia 319.60)。

1 个答案:

答案 0 :(得分:2)

您不能简单地#include <glext.h>并期望此问题能够自行解决。这个标题只是等式的一半,它定义了OpenGL扩展使用的基本常量,函数签名,typedef等,但实际上并没有解决扩展OpenGL的问题。

在大多数平台上,您可以保证某个版本的OpenGL(Windows上为1.1),并且要使用比此版本更新的OpenGL的任何部分,您必须在 运行时 <扩展API / strong>即可。 Linux也不例外,为了使用glMultiDrawArraysIndirect (...),您必须在运行时从驱动程序加载此扩展。这通常意味着设置函数指针,直到运行时为止,以保持编译器/链接器满意。

到目前为止,最简单的解决方案是使用GLEW之类的东西,它将在运行时加载驱动程序支持的所有版本,直到OpenGL 4.4版本。它将取代glext.h,您需要做的就是在设置渲染上下文后初始化库。