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() を使う。