ソフトウェア設計及び演習2017

GTK+とOpenGLの連携

GTK+ OpenGL Extension

  • GDKのドローイングエリアに対して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 の指定も必要です.

初期化

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);

OpenGLを使った描画のサンプル

  • OpenGLで(GDKのドローイングエリアに)teapotを描画する

ソースプログラムの所在

実行手順

 #svnから持ってくる(実行した直下にgtkglext-sampleディレクトリができる)
 svn export https://svn.cis.iwate-u.ac.jp/svn/csd/kimura/gtkglext-sample/
 
 #持ってきたディレクトリに移動
 cd gtkglext-sample
 
 #make
 make
 
 #実行
 ./teapot-sample


最終更新日:2017/06/09 13:52:38