Vala プログラミング

Rust & Vala プログラミング

おながのブログ

Genie + OpenGL(Gtk.GLArea)

f:id:onagat12:20151114135737p:plain

gtk+-3.16から、Gtk.GLArea ウィジェが追加され、GtkWindow内で簡単にOpenGLプログラミングが出来るようになりました。OpenGL context等が自動的に設定されます。

OpenGLライブラリとして、epoxyライブラリを使用しています。

 

Gtk.GLArea ウィジェ とOpenGLを使って、三角形を描画しています。

Genie言語で記述しています。

 

vapigles2.vapiを参考に、epoxyライブラリで使用できるように追加・修正をしています。

glepoxy.vapi

glShaderSource()関数で、シェーダーファイルの指定が上手く処理できていません。

ポインターを使って記述しています。(ワーニングが出ます。)

 

##testglarea.gs

uses

    Gtk

    GL

 

init

    Gtk.init (ref args)

    var mainWindow = new MainWindow()

    mainWindow.show_all ()

    Gtk.main ()

 

class MainWindow : Window

    gl_vao : GLuint = 0

    gl_program : GLuint

 

    init

        title = "GLArea Test"

        destroy.connect (Gtk.main_quit)

 

        var box = new Box (Orientation.VERTICAL, 0)

 

        var glarea = new GLArea ()

        glarea.set_size_request (500, 400)

        glarea.render.connect (on_glarea_render)

 

        var button = new Button.with_label ("Quit")

        button.clicked.connect (Gtk.main_quit)

 

        box.pack_start (glarea, true, true)

        box.pack_start (button, false, false)

        add (box)

 

   def on_realize (cntxt:Gdk.GLContext)

        print ("realize")

 

        gl_buffer : GLuint = 0

 

        vert_src : GLchar* = "#version 330\n \n in vec4 position;\n void main() {\n gl_Position = position;\n }";

 

        frag_src : GLchar* = "#version 330\n \n out vec4 outputColor;\n void main() {\n outputColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n }";

 

        /// realize

        verts : array of float = { +0.0f, +1.0f, -1.0f, -1.0f, +1.0f, -1.0f}

 

        vert_shader : GLuint

        frag_shader : GLuint

        compileSuccess : GLint = 0

 

        vert_shader = glCreateShader (GL_VERTEX_SHADER);

        frag_shader = glCreateShader (GL_FRAGMENT_SHADER);

 

        glShaderSource(vert_shader, 1, &vert_src, null);

        glCompileShader(vert_shader);

        glGetShaderiv (vert_shader, GL_COMPILE_STATUS, out compileSuccess);

        if compileSuccess == GL_FALSE do print ("vert-shader Error")

 

        glShaderSource(frag_shader, 1, &frag_src, null);

        glCompileShader(frag_shader);

        glGetShaderiv (frag_shader, GL_COMPILE_STATUS, out compileSuccess);

        if compileSuccess == GL_FALSE do print ("frag-shader Error")

 

        gl_program = glCreateProgram();

        glAttachShader(gl_program, vert_shader);

        glAttachShader(gl_program, frag_shader);

        glLinkProgram(gl_program);

 

        glGenVertexArrays(1, out gl_vao);

        glBindVertexArray(gl_vao);

 

        glGenBuffers(1, out gl_buffer);

        glBindBuffer(GL_ARRAY_BUFFER, gl_buffer);

        glBufferData(GL_ARRAY_BUFFER, sizeof(float)*verts.length, verts, GL_STATIC_DRAW);

 

        glEnableVertexAttribArray(0);

        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

        glBindVertexArray(0);

 

        glDeleteBuffers(1, out gl_buffer);

 

   def on_glarea_render (cntxt:Gdk.GLContext): bool

        print ("render")

        on_realize (cntxt)

        /// render

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

 

        glUseProgram(gl_program);

        glBindVertexArray(gl_vao);

        glDrawArrays(GL_TRIANGLES, 0, 3);

 

        glBindVertexArray (0);

        glUseProgram (0);

 

        glFlush();

 

        return true

 

 

ビルド

valac --vapidir=../vapi --pkg gtk+-3.0 --pkg glepoxy -X -lepoxy testglarea.gs