Vala プログラミング

WebGPU プログラミング

おなが@京都先端科学大

Vala言語とOpenGL

f:id:onagat12:20150227190934p:plain

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

 

描画の方法
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);