在GtkGLArea信号之外调用OpenGL函数

时间:2016-05-19 12:11:51

标签: c opengl gtk3 cairo gdk

我正在尝试创建一个库,可以使用GTK3创建一个OpenGL上下文,它可以自动呈现或使用1个函数调用(类似于交换缓冲区函数)。我正在查看GtkGLArea的源代码,它似乎具有以下执行顺序:

  1. 使用超类GtkGLArea创建新的GtkWidget
  2. 当捕获超类的realize信号时,GdkGLContext 创建并向用户发出realize信号。用户应该将初始OpenGL函数放在传递给该信号的函数中。
  3. 还捕获了超类的draw信号,调用了一些OpenGL初始化代码来绑定帧缓冲区(或纹理)和渲染缓冲区。如果它们不存在,则创建缓冲区。在此之后,给出用户应该放置渲染OpenGL代码的render信号。最后调用gdk_cairo_draw_from_gl函数在通过draw信号传递的超类的Cairo上下文中绘制渲染缓冲区(或纹理)。
  4. 对于用户来说,它基本上归结为:

    void realize(GtkGLarea *area){
        // OpenGL initialization functions
    }
    gboolean render(GtkGLArea *area, GdkGLContext *context){
        // OpenGL rendering functions
        return TRUE;
    }
    
    // Init functions, setup a GTK window
    GtkWidget *gl_area = gtk_gl_area_new();
    g_signal_connect(gl_area, "realize", G_CALLBACK(realize), NULL);
    g_signal_connect(gl_area, "render", G_CALLBACK(render), NULL);
    // Add gl_area to the window and display the window
    

    但那不是我想要的,我想要的是这个:

    // Init functions, setup a GTK window
    // Setup a OpenGL context on the GTK window
    // OpenGL initialization functions
    while(1){ // Main loop
        if(gtk_events_pending()){
            gtk_main_iteration();
        } 
        // OpenGL rendering functions
        swapBuffers();
    }
    

    实现这一目标的最佳方法是什么?我通过模拟围绕信号调用的函数,并使用从GdkGLContext获取的GdkWindow上创建的GtkDrawingArea来尝试此操作(失败)。

    这些是我现在可以想象的解决方案:

    • 创建一个扩展GtkWidget并使用GdkGLContext的自定义GTK3类,并以某种方式跟踪调用绘图信号的时间,以便围绕该信号调用相应的OpenGL函数。
    • 找到一种方法来忽略整个GTK3部分并尝试使用底层的Xlib函数通过X11创建一个OpenGL上下文(根本不可移植)。
    • 使用带有线程的邪恶黑客,setjmplongjmp进入和退出来自swapBuffers函数的信号。

    这些"解决方案中没有一个"真的很吸引我,我想要的是不可能的,还是我只是缺少一些信息?

0 个答案:

没有答案