7

我创建了一个带有基本 draw() 方法的虚拟类,它什么都不做。这样做的目的是让其他类、形状和其他能够在 OpenGL 中绘制自己的东西将继承这个虚拟类,从而允许我创建指向许多不同类的指针数组。这背后的想法是我希望能够将指向该数组的指针传递给我的 glutDisplayFunc 回调。(这恰好被命名为 drawScene()。不幸的是,我似乎无法向它传递任何东西,因为 glutDisplayFunc 旨在采用不带参数且不返回任何内容的方法。

有什么方法可以将参数传递给回调函数,然后有什么方法可以将指针传递给我的 drawScene 函数?

(TLDR?见下文。)

本质上我希望能够做到这一点:

class a{ ... };
void drawScene( a** a_array_pointer){ ... }
glutDisplayFunc(drawScene); // <-- How do I pass an argument into this?
4

4 回答 4

1

有什么方法可以将参数传递给回调函数,然后有什么方法可以将指针传递给我的 drawScene 函数?

不。 glut 真的是一个 C 库,它glutDisplayFunc需要一个函数指针作为它的参数。在该回调中使用变量的唯一方法是使它们成为类的全局变量或静态变量。

于 2012-09-06T12:04:56.930 回答
1

您必须使用指针参数化您的 drawScene。

#include <GL/glut.h>

template <void *T>
void drawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if (T == (void *)0) {
        /* handle no array */
    } else {
        /* handle array */
    }
    glutSwapBuffers();
} 

int main(int argc, char **argv)
{
    glutDisplayFunc(drawScene<(void *)0>);

    return 0;
}

这仅在编译时有效。如果您需要在运行时更改 drawScene 的行为,您必须重新编译另一个模块,使用 LoadLibrary/GetProcAddress 加载它并更改指针,或者您必须使用线程本地存储和锁定。

这是 glut 的主要缺陷之一,因为没有显示参数使得在多个线程上运行时更改显示行为非常昂贵,因为您需要锁或复杂的替代方案。

于 2017-12-26T22:54:40.320 回答
0

不幸的是,这是不可能的。glutDisplayFunc想要一个指向没有参数的函数的指针。请参阅手册页

于 2012-09-06T11:53:10.517 回答
0

这是您应该使用全局变量的情况之一。

另请参阅:如何将类方法作为 C++ 和 openGL 中另一个函数的参数传递?

于 2012-09-06T11:53:38.020 回答