

GtkmmのGLAreaを使用してOpenGLによるグラフィックスプログラミングを行おうとしているのですが、glBegin〜glEndやglDraw*を呼び出しても内容が描かれません。glfwを使って同じコードで描画した場合には描画されるにもかかわらず、Gtkmmを用いた場合にはDrawCallが無視されているようです。以下が問題のコードです。

[code]

    std::vector<glm::vec2> vtx {
                { 0, 1 },
                { -1, -1 },
                { 1, -1 }
    };
    const char* vertex_source =
                "#version 460"
                ""
                "in vec2 position;"
                ""
                "void main() {"
                "   gl_Position = vec4(position, 0, 1);"
                "}";
    const char* fragment_source =
                "#version 460"
                ""
                "out vec4 outColor;"
                ""
                "void main() {"
                "   outColor = vec4(1, 1, 1, 1);"
                "}";
    
    class canvas : public Gtk::GLArea {
    public:
        canvas() {
    
        }
        void on_realize() override {
            Widget::on_realize();
    
            make_current();
    
            //create shader
            shader = glCreateProgram();
            //attach vertex and fragment shaders
    
            //create buffer
            glGenBuffers(1, &vbo);
            //glBindBuffer, glBufferData 
    
            glClearColor(0, 0, 0, 1);
        }
        void on_unrealize() override {
            Widget::on_unrealize();
    
            //destroy buffer and shader
        }
        bool on_render(const Glib::RefPtr<Gdk::GLContext>&) override {
            glClear(GL_COLOR_BUFFER_BIT);
            glUseProgram(shader);
            glBindBuffer(vbo);
            glEnableVertexAttribArray(0);
            glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            glDisableVertexAttribArray(0);
    
            glUseProgram(0);
            glFlush();
        }
    private:
        GLuint shader;
        GLuint vbo;
    };
    
    int main(int argc, char* argv[]) {
        auto app = Gtk::Application::create(argc, argv);
        Gtk::Window window;
        window.set_default_size(1000, 700);
        canvas cv;
        window.add(cv);
        window.show_all_children();
    
        return app->run(window);
    }
    
[/code]

上記のコードでglDraw*は無視されるのですが、glClearColorで設定した色で背景は塗りつぶされるようです。  
期待する動作は黒の背景に白の大きな三角形が描かれることですが、どのようにすれば描画されるようになるでしょうか。

環境はUbuntu18.04、Gtkmm 3.22.2です。  
よろしくお願いいたします。


CC BY-SA 4.0
2021-02-18T13:27:23.000
74113
2021-02-18T14:04:55.933
32650
question
c++ opengl gtk
Gtk::GLAreaで描画がされない


OpenGLは2.0相当のものしかやったことがないのでアレですけど。

[code]

    const char* vertex_source =
                "#version 460"
                ""
                "layout (location = 0) in vec2 position;"
                ""
                "void main() {"
                "   gl_Position = vec4(position, 0, 1);"
                "}";
    
[/code]

でないでしょうか。

`glEnableVertexAttribArray`関数などで指定するattribute変数のローケーションですが、  
明示的に指定しなけれれば何番にロケーションされるは定かではありません。  
なので、(OpenGL3.0以降であれば)シェーダ内でlayout修飾子で明示的に指定するか、`glBindAttribLocation`関数で明示的に指定するか、`glGetAttribLocation`関数で何番にロケーションされたか調査しなければなりません。

  * 参考: [layout 修飾子によるロケーション指定](https://wgld.org/d/webgl2/w004.html)


CC BY-SA 4.0
2021-02-18T13:54:46.533
74114
2021-02-18T14:04:55.933
2021-02-18T14:04:55.933
15473
15473
74113
answer