!!! GTK+ OpenGL Extension * GDKのドローイングエリアに対してOpenGLの描画関数を適用できるように拡張されたライブラリ. ** [本家|https://projects.gnome.org/gtkglext/] !!! 連携の仕組み 基本的には, * GDKのドローイングエリアに対してOpenGLが利用できるような設定を加え,(GLウィジェットの生成) * GLウィジェットから,OpenGL専用のコンテキストとドローイングエリアを抽出し, * その専用コンテキストの設定や専用ドローイングへの描画を,OpenGLの関数で行う, という流れです. !! 演習用端末でのコンパイル,リンク時の注意 GTK+ OpenGL Extension(以下,gtkglext)を使ったプログラムには 8< #include #include >8 が必要です.また,コンパイル時には 8< $ gcc teapot-sample.c `pkg-config --cflags --libs gtk+-2.0 gtkglext-1.0` >8 のように,'''gtkglext-1.0 の指定も必要'''です. !! 初期化 * [gtk_gl_init()|https://developer.gnome.org/gtkglext/stable/gtkglext-gtkglinit.html] gtkglextを使う場合に必ず必要 8< void gtk_gl_init (int *argc, char ***argv); >8 !! GDKのドローイングエリアに対してOpenGLを利用可能とする設定 GLコンパチブルなウィジェット(以下,GLウィジェット)の生成 * [gtk_widget_set_gl_capability()|https://developer.gnome.org/gtkglext/stable/gtkglext-gtkglwidget.html#gtk-widget-set-gl-capability] ** 関連[GdkGLConfig|https://developer.gnome.org/gtkglext/stable/gtkglext-gdkglconfig.html#GdkGLConfig], [GdkGLContext|https://developer.gnome.org/gtkglext/stable/gtkglext-gdkglcontext.html#GdkGLContext-struct] 8< gboolean gtk_widget_set_gl_capability(GtkWidget *widget, GdkGLConfig *glconfig, GdkGLContext *share_list, gboolean direct, int render_type); >8 * 使い方の例 8< 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)) >8 !! GLウィジェットへの(OpenGLによる)描画 ! GLウィジェットからコンテキストとドローアブルを取得 * [gtk_widget_get_gl_context()|https://developer.gnome.org/gtkglext/stable/gtkglext-gtkglwidget.html#gtk-widget-get-gl-context] 8< GdkGLContext* gtk_widget_get_gl_context (GtkWidget *widget); >8 * [gtk_widget_get_gl_drawable()|https://developer.gnome.org/gtkglext/stable/gtkglext-gtkglwidget.html#gtk-widget-get-gl-drawable] 8< #define gtk_widget_get_gl_drawable(widget) >8 使い方の例 8< GdkGLContext *gl_context = gtk_widget_get_gl_context(drawing_area); GdkGLDrawable *gl_drawable = gtk_widget_get_gl_drawable(drawing_area); >8 ! OpenGLライブラリの使い方 まず,OpenGLによる描画開始を宣言します. * [gdk_gl_drawable_gl_begin()|https://developer.gnome.org/gtkglext/stable/gtkglext-gdkgldrawable.html#gdk-gl-drawable-gl-begin] 8< gboolean gdk_gl_drawable_gl_begin (GdkGLDrawable *gldrawable, GdkGLContext *glcontext); >8 この関数を呼び出した後であればOpenGL関数が利用できます.一般的には,expose_eventなどのコールバック関数内に記述して使うことになります.(サンプルプログラム参照) * OpenGL固有の関数に関する使い方,呼び出し方などについては'''別途,調べましょう'''. なお,一度だけ呼べばよいOpenGLの設定(ビューポートの指定とか,光源の設定とか)については, * '''configure_eventのコールバック関数内で処理''' するのが良いようです.(configure_eventについては[[GDK2014::アニメーション]]) OpenGLを使い終わったら,必ず終了を宣言します. * [gdk_gl_drawable_gl_end()|https://developer.gnome.org/gtkglext/stable/gtkglext-gdkgldrawable.html#gdk-gl-drawable-gl-end] 8< void gdk_gl_drawable_gl_end (GdkGLDrawable *gldrawable); >8 !! OpenGLを使った描画のサンプル * OpenGLで(GDKのドローイングエリアに)teapotを描画する ! ソースプログラムの所在 * 以下のsvnのリポジトリ ** https://svn.cis.iwate-u.ac.jp/svn/csd/kimura/gtkglext-sample/ ! 実行手順 8< #svnから持ってくる(実行した直下にgtkglext-sampleディレクトリができる) svn export https://svn.cis.iwate-u.ac.jp/svn/csd/kimura/gtkglext-sample/ #持ってきたディレクトリに移動 cd gtkglext-sample #make make #実行 ./teapot-sample >8 !! リンク * [GTK+ OpenGL Extension|https://projects.gnome.org/gtkglext/] * [リファレンスマニュアル|https://developer.gnome.org/gtkglext/stable/](英語) * [freeglut3(OpenGL Utility Toolkit)|http://freeglut.sourceforge.net/docs/api.php]