Vala言語を使ったOpenGLによる描画について書いています。
プログラムのサンプルが、GNOME Wiki! のページにあります。
Vala OpenGL Samples(https://wiki.gnome.org/Projects/Vala/OpenGLSamples)
GLFW、GtkGLExt、GLX、GLUTライブラリを使ったサンプルです。
プログラムのビルドには、vapi(C言語とのバインディング)が必要です。
External Vala Bindings(https://wiki.gnome.org/Projects/Vala/ExternalBindings)
Gtkウィンドウ内でOpenGLを使う時には、GtkGLExtとGLXを利用することになります。
・GtkGLExt
Ubuntu等のパッケージリポジットリにあるライブラリはgtk+-2.0用で、
gtk+-3.0で使うには自分でビルドしなければなりません。ライブラリの修正が必要となります。
・GLX
GLXを利用したプログラムは、EWGENYのサイトで紹介しています。
Turorial for OpenGL and Gtk3+ combined, written in Vala(https://ewgeny.wordpress.com/2012/12/11/turorial-for-opengl-and-gtk3-combined-written-in-vala/)
GLXを使う時には、プログラム内でGLXの設定をしなければなりません。これは割と複雑な設定です。
この他に、Gtkウィンドウ内でOpenGLを使う方法として、ClutterとCoglがあります。
下のプログラムは、ClutterとCoglを使ってColoured Triangleを描画するものです。
gtkcluttergl.vala
using Gtk;
using GtkClutter;
using Clutter;
public class MainWindow : Gtk.Window
{
private Clutter.Actor coglbox;
public MainWindow ()
{
title = "GtkClutterGL";
set_default_size (300, 300);
destroy.connect (Gtk.main_quit);
var widget = new Embed ();
add(widget);
var stage = widget.get_stage ();
stage.width = stage.height = 300;
stage.background_color = Clutter.Color () { alpha = 255 };
coglbox = new Clutter.Actor ();
stage.add_actor (coglbox);
coglbox.paint.connect (paint_cb);
}
private void paint_cb ()
{
Cogl.TextureVertex vertices1[3];
vertices1[0].x = 150;
vertices1[0].y = 0;
vertices1[0].z = 0;
vertices1[0].color.set_from_4f (1.0f, 0.0f, 0.0f, 1.0f);
vertices1[1].x = 0;
vertices1[1].y = 300;
vertices1[1].z = 0;
vertices1[1].color.set_from_4f (0.0f, 1.0f, 0.0f, 1.0f);
vertices1[2].x = 300;
vertices1[2].y = 300;
vertices1[2].z = 0;
vertices1[2].color.set_from_4f (0.0f, 0.0f, 1.0f, 1.0f);
Cogl.polygon (vertices1, true);
}
}
void main (string[] args)
{
GtkClutter.init (ref args);
var window = new MainWindow ();
window.show_all ();
Gtk.main ();
}
ビルド
valac --pkg gtk+-3.0 --pkg clutter-gtk-1.0 gtkcluttergl.vala
描画の方法
1 GtkウィンドウにClutterで描画する時には、Embedクラスのウィジェを使います。
var widget = new Embed ();
add(widget);
2 EmbedウィジェにはStageが組み込まれているので、それを取り出します。
var stage = widget.get_stage ();
3 直接描画するActorを作成し、Stageに貼り付けます。
coglbox = new Clutter.Actor ();
stage.add_actor (coglbox);
4 Actorのpaintシグナルを使って、描画するコールバック関数を呼び出して、
描画します。
coglbox.paint.connect (paint_cb);