PyGObjectでGLAreaウィジェットを使用しようとすると、以前の質問(Use of the Gtk.GLArea in Pygobject GTK3)がありました。私はコマンドを描くためにPythonのバージョンを取得したことはありませんでしたので、私はそれをよりよく理解しようとするCバージョンを与えるだろうと思った。 Gtk3がすべて含まれているのでUbuntu 16を使って、私はそれを撃った。次のコードは、エラーまたは警告なしでコンパイルおよび実行されますが、含まれているGL_LINES命令は描画されません。本当に奇妙なことは、glClearColorが背景を変更し、GL_LINESが同じ関数に変更されていることです。ご覧のとおり、私はUbuntuに含まれているエポキシ/ glライブラリーを使用しています。これは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);')のようなものだと思いますが、 'glMatrixMode(GL_MODELVIEW);'代わりに 'glMatrixMode()')を使用してください。 – Scheff
Completeleyは関係ありませんが、あなたは 'destroy_event'ではなく' destroy'に接続して 'gtk_main_quit'を呼び出すことになっています。 – liberforce
'gtk-demo'を実行して、glのサンプルを見てください。間違っていることが分かりますか?この例もここにあります:https://git.gnome.org/browse/gtk+/tree/demos/gtk-demo/glarea.c – liberforce