2014-03-12 32 views
0

我是相当新的C/C++编程,所以请原谅我,如果事情听起来很愚蠢,你...GTK +线程与OpenGL的GLUT/FreeGLUT

我目前的工作,涉及到一个Visual Studio C++ 2010项目opengl,glut/freeglut和gtk +。

OpenGL用于获取输入图像,在调用glDrawPixels()从缓冲区中绘制像素以在glut/freeglut窗口中显示之前,根据各种参数处理其像素。

现在我正在尝试制作一个UI,以便用户可以调整参数并在运行时查看生成的图像。

到目前为止,我所拥有的是一个GTK窗口,其中包含所有GTK小部件,以及包含OpenGL图像的glut/freeglut窗口。它的工作原理是当点击UI上的按钮时,会创建一个新的GTK线程来显示glut/freeglut窗口(其中包含OpenGL渲染图像)。

我的问题是,如何使glut/freeglut渲染更新的OpenGL图像并将其显示在相同的glut/freeglut窗口中?我不确定它是否与GTK线程或它只是glut/freeglut或两者兼而有之。剥离下来的代码,我有:

#include<freeglut.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include <gtk/gtk.h> 

GtkWidget *window; 
GtkWidget *vbox, *hbox; 
GtkWidget *button; 
gint tmp_pos; 
GThread *thread; 
gint progress = 0; 
G_LOCK_DEFINE_STATIC(progress); 
GError *error = NULL; 

void display() 
    { 
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
     glRasterPos2i(x_offset,y_offset); 
     glDrawPixels(x2-x1+1,y2-y1+1,GL_LUMINANCE,GL_UNSIGNED_BYTE,tmp_buf); 
     glFlush(); 
    } 

static gpointer runGL(gpointer data) 
{ 
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); 

    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    if(Running_Mode==0) 
    glutInitWindowSize(3*Test_Size,Test_Size); /* 500 x 500 pixel window */ 
    else 
    glutInitWindowSize(Test_Size,Test_Size); /* 500 x 500 pixel window */ 
    glutInitWindowPosition(600,0); /* place window top left on display */ 
    glutCreateWindow("Simulation"); /* window title */ 
    glutDisplayFunc(display); /* display callback invoked when window opened */ 
    myinit(); /* set attributes */ 
    glutMainLoop(); /* enter event loop */  
    return (NULL); 
} 

/* create a g_thread for glut window */ 
void GLThread() 
{ 
    thread = g_thread_create(runGL, (gpointer)button, TRUE, &error); 
    g_print("Thread created"); 
    if(!thread) 
    { 
     g_print("Error: %s\n", error->message); 
     return(-1); 
    } 
} 


int main(int argc,char **argv) 
{ 
    glutInit(&argc,argv); 

    if(! g_thread_supported()) 
     g_thread_init(NULL); 

    gdk_threads_init(); 

    /* Obtain gtk's global lock */ 
    gdk_threads_enter(); 
    gtk_init (&argc, &argv); 

    /* create a new window */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100); 
    gtk_window_set_title (GTK_WINDOW (window), "GTK Entry"); 
    g_signal_connect (window, "destroy", 
         G_CALLBACK (gtk_main_quit), NULL); 
    g_signal_connect_swapped (window, "delete-event", 
           G_CALLBACK (gtk_widget_destroy), 
           window); 

    vbox = gtk_vbox_new (FALSE, 0); 
    gtk_container_add (GTK_CONTAINER (window), vbox); 
    gtk_widget_show (vbox); 

    hbox = gtk_hbox_new (FALSE, 0); 
    gtk_container_add (GTK_CONTAINER (vbox), hbox); 
    gtk_widget_show (hbox); 

    button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); 

    /* call the GLThread function when the button is clicked */ 
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (GLThread), window); 

    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); 
    gtk_widget_set_can_default (button, TRUE); 
    gtk_widget_show (button); 
    gtk_widget_show(window); 

    gtk_main(); 
    gdk_threads_leave(); 
} 
+0

重新检查你的问题逻辑。你非常需要上面粘贴的代码。与上面的代码相比,我没有看到任何问题/差异。 – drahnr

+0

感谢您检查我的代码drahnr。我提供的代码实际上每次点击按钮时会打开一个新的过度窗口,这不是我想要的。我只需要两个窗口(和两个线程),一个是gtk UI本身,另一个是具有超显示窗口的线程。 – user3409114

回答

3

首先第一件事情:自由/ GLUT不是OpenGL的一部分它是一个第三方库具有类似范围(菊。更简单一些)像GTK +一样。如果您使用的是GTK +,则不需要GLUT。相反,您应该使用由GTKGlExt提供的GTK + OpenGL Widget。

我目前正在研究一个涉及opengl,glut/freeglut和gtk +的Visual Studio C++ 2010项目。

为什么要混合GLUT和GTK +?这样做绝对没有理由。 GLUT是一个简单的应用程序框架(创建窗口,提供事件循环),GTK +是一个应用程序框架(创建窗口,提供事件循环,具有小部件)。

选择一个,不要混合它们。

我不确定它是否与GTK线程有关,或者它只是glut/freeglut或两者。有人有建议吗?

问题是,你有两个图书馆正在努力做同样的事情(处理用户输入事件)。

+0

好的,这听起来像是一个有GLUT和GTK +的坏主意。我确实遇到了GTKGlExt,但它似乎是用C++编写的,我对此不太熟悉。不知道是否有任何好的教程可以让我开始使用它。 – user3409114

+0

@ user3409114:GTKGlExt用C编写,就像GTK本身一样。 – datenwolf

+0

看看这个问题http://stackoverflow.com/questions/3815806/gtk-and-opengl-bindings。 @datenwolf我不确定他是否在寻找'GtkGLExt'。 – drahnr