이전에 PyGObject에서 GLArea 위젯을 사용하는 것에 대해 질문했습니다 (Use of the Gtk.GLArea in Pygobject GTK3). 나는 그것을 이해하기 위해 C 버전을 제공 할 것이라고 생각 했으므로 명령을 그리기 위해 파이썬 버전을 얻지 못했습니다. Gtk3이 모두 포함되어 있기 때문에 우분투 16을 사용하여, 나는 그것을 쐈다. 다음 코드는 오류나 경고없이 컴파일되고 실행되지만 포함 된 GL_LINES 명령어는 그리지 않습니다. 정말 이상한 것은 glClearColor가 배경을 변경하고 GL_LINES가 같은 기능을 변경하는 것입니다. 당신이 볼 수 있듯이 우분투에 포함 된 에폭시/글루 라이브러리를 사용하고 있는데, GL/gl과 동등하다고 생각합니다. 어떤 아이디어?C에서 Gtk GLArea 위젯에 gl 명령이 표시되지 않습니다.
/*to compile ->
gcc `pkg-config --cflags gtk+-3.0` -o gl_area gl_area.c `pkg-config --libs gtk+-3.0 epoxy`*/
#include <math.h>
#include <gtk/gtk.h>
#include <epoxy/gl.h>
#include <stdio.h>
gint init(GtkWidget *widget)
{
/* Setup the viewport*/
glViewport(0, 0, gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height(widget));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,100, 100,0, -1,1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
printf("ran init method\n");
return TRUE;
}
/* When widget is exposed it's contents are redrawn. */
static gboolean
render (GtkGLArea *area, GdkGLContext *context)
{
/* OpenGL functions can be called only if make_current returns true */
/* Draw simple triangle */
glClearColor(.3,.3,.3,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor4f(1,1,1,1);
glBegin(GL_LINES);
{
glVertex2f(0,0);
glVertex2f(10000,10000);
glVertex2f(0,0);
glVertex2f(-10000,-10000);
glVertex2f(0,0);
glVertex2f(10000,-10000);
glVertex2f(0,0);
glVertex2f(-10000,10000);
}
glEnd();
printf("ran render method\n");
return TRUE;
}
/* When glarea widget size changes, viewport size is set to match the new size */
gint reshape(GtkWidget *widget, GdkEventConfigure *event)
{
/* OpenGL functions can be called if context is current */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
printf("ran rehsape method\n");
glViewport(0, 0, gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height(widget));
return TRUE;
}
int main(int argc, char **argv)
{
/* initialize gtk */
gtk_init(&argc, &argv);
/* Create new top level window. */
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GL Area Test");
gtk_window_set_default_size (GTK_WINDOW(window),
640,
480);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
/* Quit main if got delete event */
g_signal_connect(G_OBJECT(window),
"delete-event",
G_CALLBACK(gtk_main_quit),
NULL);
/* Create new OpenGL widget. */
GtkWidget *glarea = gtk_gl_area_new();
/* Do initialization when widget has been realized. */
g_signal_connect(glarea, "realize", G_CALLBACK(init), NULL);
/* When window is resized viewport needs to be resized also. */
g_signal_connect(glarea, "configure-event", G_CALLBACK(reshape), NULL);
/* Render signal should be sent once the context is set to current. */
g_signal_connect (glarea, "render", G_CALLBACK (render), NULL);
/* set minimum size */
gtk_widget_set_size_request(glarea, 100,100);
/* put glarea into window and show it all */
gtk_container_add(GTK_CONTAINER(window), glarea);
gtk_widget_show_all (window);
gtk_main();
return 0;
}
IMHO, :;'당신'glMatrixMode (GL_PROJECTION)를 호출, 다시''glLoadIdentity 함수(); 'glOrtho (0100, 100,0, -1,1)이 후'. 이것은'glOrtho()'의 이전 호출을 덮어 쓴다. (만약 내가 기억한다면'glOrtho (-1, 1, -1, -1, -1, 1);'). 그러나'glMatrixMode (GL_MODELVIEW);' 대신'glMatrixMode()')를 사용하십시오. – Scheff
Completeley는 관련이 없지만'delete-event'가 아닌'destroy'에 연결하면'gtk_main_quit'가 호출됩니다. – liberforce
'gtk-demo'를 실행하십시오. gl 예제를 보시면 어떨까요? 그 예도 여기에 있습니다 : https://git.gnome.org/browse/gtk+/tree/demos/gtk-demo/glarea.c – liberforce