前回プログラム(Genie + OpenGL)のワーニング
前回使用したプログラム(testglarea.gsとglarea.gs)とvapiでは、glShaderSource関数に関して、以下のようなワーニングが出ていました。
** ワーニング **
testglarea.vala.c: 関数 ‘main_window_on_realize’ 内:
testglarea.vala.c:150:39: 警告: 互換性のないポインタ型から 3 番目の ‘epoxy_glShaderSource’ の引数に渡しています [-Wincompatible-pointer-types]
glShaderSource (_tmp3_, (GLsizei) 1, &vert_src, NULL);
^
testglarea.vala.c:150:39: 備考: expected ‘const GLchar * const* {aka const char * const*}’ but argument is of type ‘GLchar ** {aka char **}’
(vertex shaderとfragment shaderの両方で出てきます。)
関連するプログラムとvapiの部分は以下のようになっています。
プログラム
vert_src : GLchar* = "#version 330\n \n in vec4 position;\n void main() {\n gl_Position = position;\n }";
glShaderSource(vert_shader, 1, &vert_src, null);
(vert_src変数はポインターとして扱っています。)
vapi
public void glShaderSource (GLuint shader, GLsizei count, GLchar* *source, GLint* length);
今回、この部分をワーニングが出ないように修正しました。
プログラム
const vert_src : array of string = {"#version 330\n \n in vec4 position;\n void main() {\n gl_Position = position;\n }"};
glShaderSource(vert_shader, 1, vert_src, null);
vapi
public void glShaderSource (GLuint shader, GLsizei count, string *source, GLint* length);
##testglarea.gs
uses
GL
init
Gtk.init (ref args)
var mainWindow = new MainWindow()
mainWindow.show_all ()
Gtk.main ()
const vert_src : array of string = {"#version 330\n \n in vec4 position;\n void main() {\n gl_Position = position;\n }"};
const frag_src : array of string = {"#version 330\n \n out vec4 outputColor;\n void main() {\n outputColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n }"};
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
/// 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