GtkGLExt を使ってみる2010年2月13日 ![]() | |
はじめにGTK+ で OpenGL を使うために、GtkGLExt を使ってみる。 環境MinGW 5.1.4、GtkGLExt 1.2.0 を使用。GLUT も使っています。 ファイルコンパイルの準備GTK+ とともに GtkGLExt を使うので、pkg-config に GtkGLExt も指定する。GLUT も使うので、リンクに含める。Makefile の変数は以下のようになる。 CFLAGS = -Wall -O2 `pkg-config --cflags gtk+-2.0 gtkglext-1.0` LIBS = -lglut32 `pkg-config --libs gtk+-2.0 gtkglext-1.0` プログラムの内容プログラムは、GLUT で書いたものを GTK+ と GtkGLExt 用に書き直したものである。ティーポットをマウスでグリグリ動かすというもので、グリグリにはトラックボール (GLUT の examples に含まれている trackball.c, trackball.h) を使っている。 さて、コードを見てみよう。初期化は以下のようにする。 gtk_init(&argc, &argv); gtk_gl_init(&argc, &argv); ウインドウを作成した後、描画領域として GtkDrawingArea を作る。ここまでは GTK+ と同じ。GtkDrawingArea に対して、GtkGLExt 用の設定を以下のように行う。 config = gdk_gl_config_new_by_mode( GDK_GL_MODE_DOUBLE | GDK_GL_MODE_RGB); gtk_widget_set_gl_capability(drawingArea, config, NULL, TRUE, GDK_GL_RGBA_TYPE); GDK_GL_MODE_DOUBLE はダブルバッファリングを使用するための指定。GLUT の glutInitDisplayMode() と同じ感じ。 gtk_main() でメインループに入るのも、GTK+ の型どおり。 OpenGL のコードは、以下のもので挟み込む。 GdkGLDrawable *drawable = gtk_widget_get_gl_drawable(drawingArea); GdkGLContext *context = gtk_widget_get_gl_context(drawingArea); gdk_gl_drawable_gl_begin(drawable, context); /* ... ここに OpenGL のコードを書く ... */ gdk_gl_drawable_gl_end(drawable); ここで drawingArea は GtkDrawinArea オブジェクト。 ダブルバッファリングを使っているので、バッファをスワップする必要があるが、以下のように行う (GLUT の glutSwapBuffers() の代わり)。 gdk_gl_drawable_swap_buffers(drawable); GLUT では再描画要求に glutPostRedisplay() を使っていたが、GTK+ では gtk_widget_queue_draw() を使う。 | |
PENGUINITIS |