将1个参数(指针)传递给glutDisplayFunc?

问题描述 投票:4回答:4

我用一个基本的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?
c++ opengl glut
4个回答
1
投票

有没有办法将参数传递给回调函数,然后将指针传递给我的drawScene函数?

编号过剩实际上是一个C库,而glutDisplayFunc期望一个函数指针作为它的参数。在该回调中使用变量的唯一方法是使它们成为类的全局变量或静态变量。


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加载它并更改指针,或者必须使用线程本地存储和锁定。

这是过剩的主要缺陷之一,因为没有显示参数会使得在多个线程上运行时显示的行为变得非常昂贵,因为你需要锁或复杂的替代品。


0
投票

不幸的是,这是不可能的。 glutDisplayFunc想要一个指向没有参数的函数的指针。见the manual page


0
投票

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

另见:How to pass a class method as an argument for another function in C++ and openGL?

© www.soinside.com 2019 - 2024. All rights reserved.