gpt4 book ai didi

c - GTK+ 线程与 OpenGL 的 GLUT/FreeGLUT

转载 作者:太空宇宙 更新时间:2023-11-04 07:19:32 25 4
gpt4 key购买 nike

我是 C/C++ 编程的新手,所以如果您觉得有些愚蠢,请原谅...

我目前正在从事一个涉及 opengl、glut/freeglut 和 gtk+ 的 Visual Studio C++ 2010 项目。

OpenGL 用于获取输入图像,在调用 glDrawPixels() 之前根据各种参数操纵其像素,以从缓冲区绘制像素以在过剩/自由过剩窗口中显示。

现在我正在尝试制作一个 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();
}

最佳答案

首先要注意的是:Free-/GLUT 不是 OpenGL 的一部分。它是一个 3rd 方库,具有与 GTK+ 类似的范围(只是更简单)。如果您使用的是 GTK+,则不需要 GLUT。相反,您应该使用 GTKGlExt 提供的 GTK+ OpenGL Widget .

I am currently working on a Visual Studio C++ 2010 project that involves opengl, glut/freeglut, and gtk+.

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

二选一,不要混用。

I am not sure if it has to do with GTK threading or it's just glut/freeglut, or both. Does anyone have any advice?

问题是,您有两个库争相做同一件事(处理用户输入事件)。

关于c - GTK+ 线程与 OpenGL 的 GLUT/FreeGLUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com