【问题标题】:Passing 1 argument (pointer) to glutDisplayFunc?将 1 个参数(指针)传递给 glutDisplayFunc?
【发布时间】:2012-09-06 11:41:20
【问题描述】:

我创建了一个带有基本 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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你必须用指针参数化你的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 的主要缺陷之一,因为没有显示参数会导致在运行时在多个线程上更改显示行为非常昂贵,因为您需要锁或复杂的替代方案。

    【讨论】:

    • 请使用nullptr而不是(void*)0!!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-11-07
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        相关资源
        最近更新 更多