我正在尝试创建一个库,可以使用GTK3创建一个OpenGL上下文,它可以自动呈现或使用1个函数调用(类似于交换缓冲区函数)。我正在查看GtkGLArea
的源代码,它似乎具有以下执行顺序:
GtkGLArea
创建新的GtkWidget
。realize
信号时,GdkGLContext
创建并向用户发出realize
信号。用户应该将初始OpenGL函数放在传递给该信号的函数中。draw
信号,调用了一些OpenGL初始化代码来绑定帧缓冲区(或纹理)和渲染缓冲区。如果它们不存在,则创建缓冲区。在此之后,给出用户应该放置渲染OpenGL代码的render
信号。最后调用gdk_cairo_draw_from_gl
函数在通过draw
信号传递的超类的Cairo上下文中绘制渲染缓冲区(或纹理)。对于用户来说,它基本上归结为:
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函数。setjmp
和longjmp
进入和退出来自swapBuffers函数的信号。这些"解决方案中没有一个"真的很吸引我,我想要的是不可能的,还是我只是缺少一些信息?