Genie + OpenGL(Gtk.GLArea)
gtk+-3.16から、Gtk.GLArea ウィジェが追加され、GtkWindow内で簡単にOpenGLプログラミングが出来るようになりました。OpenGL context等が自動的に設定されます。
OpenGLライブラリとして、epoxyライブラリを使用しています。
Gtk.GLArea ウィジェ とOpenGLを使って、三角形を描画しています。
Genie言語で記述しています。
vapiはgles2.vapiを参考に、epoxyライブラリで使用できるように追加・修正をしています。
glShaderSource()関数で、シェーダーファイルの指定が上手く処理できていません。
ポインターを使って記述しています。(ワーニングが出ます。)
##testglarea.gs
uses
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