0

有没有人成功使用过 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);

我在 Linux 上安装了 Quadro 2000 和最新的驱动程序 (NVidia 319.60)。

4

1 回答 1

2

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

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

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

于 2013-11-15T00:24:26.943 回答