我创建了一个带有基本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?
答案 0 :(得分:1)
有没有办法将参数传递给回调函数,然后将指针传递给我的drawScene函数?
没有。 glut实际上是一个C库,而glutDisplayFunc
期望一个函数指针作为它的参数。在该回调中使用变量的唯一方法是使它们成为类的全局变量或静态变量。
答案 1 :(得分: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加载它并更改指针,或者必须使用线程本地存储并锁定。
这是过剩的主要缺陷之一,因为没有显示参数会使得在多个线程上运行时显示的行为变得非常昂贵,因为你需要锁或复杂的替代品。
答案 2 :(得分:0)
不幸的是,这是不可能的。 glutDisplayFunc
想要一个指向没有参数的函数的指针。请参阅the manual page。
答案 3 :(得分:0)
这是您应该使用全局变量的情况之一。
另见:How to pass a class method as an argument for another function in C++ and openGL?