ソフトウェア設計及び演習2017
GTK+とOpenGLの連携
連携の仕組み
基本的には,
- GDKのドローイングエリアに対してOpenGLが利用できるような設定を加え,(GLウィジェットの生成)
- GLウィジェットから,OpenGL専用のコンテキストとドローイングエリアを抽出し,
- その専用コンテキストの設定や専用ドローイングへの描画を,OpenGLの関数で行う, という流れです.
演習用端末でのコンパイル,リンク時の注意
GTK+ OpenGL Extension(以下,gtkglext)を使ったプログラムには
#include <gtk/gtkgl.h> #include <GL/gl.h>
が必要です.また,コンパイル時には
$ gcc teapot-sample.c `pkg-config --cflags --libs gtk+-2.0 gtkglext-1.0`
のように,gtkglext-1.0 の指定も必要です.
初期化
- gtk_gl_init() gtkglextを使う場合に必ず必要
void gtk_gl_init (int *argc, char ***argv);
GDKのドローイングエリアに対してOpenGLを利用可能とする設定
GLコンパチブルなウィジェット(以下,GLウィジェット)の生成
gboolean gtk_widget_set_gl_capability(GtkWidget *widget, GdkGLConfig *glconfig, GdkGLContext *share_list, gboolean direct, int render_type);
- 使い方の例
GtkWidget *drawing_area = gtk_drawing_area_new(); ... GdkGLConfig *gl_config = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); gtk_widget_set_gl_capability(drawing_area, gl_config, NULL, TRUE, GDK_GL_RGBA_TYPE))
GLウィジェットへの(OpenGLによる)描画
GLウィジェットからコンテキストとドローアブルを取得
GdkGLContext* gtk_widget_get_gl_context (GtkWidget *widget);
#define gtk_widget_get_gl_drawable(widget)
使い方の例
GdkGLContext *gl_context = gtk_widget_get_gl_context(drawing_area); GdkGLDrawable *gl_drawable = gtk_widget_get_gl_drawable(drawing_area);
OpenGLライブラリの使い方
まず,GLウィジェットに対して,OpenGLによる描画開始を宣言します.
gboolean gdk_gl_drawable_gl_begin (GdkGLDrawable *gldrawable, GdkGLContext *glcontext);
この関数を呼び出した後であればOpenGL関数が利用できます.一般的には,expose_eventなどのコールバック関数内に記述して使うことになります.(サンプルプログラム参照)
- OpenGL固有の関数に関する使い方,呼び出し方などについては別途,調べましょう.
なお,一度だけ呼べばよいOpenGLの設定(ビューポートの指定とか,光源の設定とか)については,
- configure_eventのコールバック関数内で処理
するのが良いようです.(configure_eventについてはGDK2017::アニメーション)
OpenGLを使い終わったら,必ず終了を宣言します.
void gdk_gl_drawable_gl_end (GdkGLDrawable *gldrawable);
最終更新日:2017/06/09 13:52:38