Vala プログラミング

WebGPU プログラミング

おなが@京都先端科学大

Genie + OpenGL(3)

前回プログラム(Genie + OpenGL)のワーニング

前回使用したプログラム(testglarea.gsglarea.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 shaderfragment 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);

 

glepoxy.vapi

 

##testglarea.gs

uses

    Gtk

    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