From af89079d62b48bbf3c9ca9492c235c0894100d4f Mon Sep 17 00:00:00 2001 From: allem Date: Mon, 15 Jul 2019 23:07:51 -0400 Subject: [PATCH] simple cyan triangle --- cosets/src/main.cpp | 54 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index 0da7e0a..e807fe6 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -62,6 +62,7 @@ public: class CosetsWindow : public Window { GLint program; + GLuint vao; GLint build_shader(GLenum type, const string &name, const string &src) { const char *c_str = src.c_str(); @@ -78,36 +79,73 @@ class CosetsWindow : public Window { char log[log_len]; glGetShaderInfoLog(s, log_len, nullptr, log); fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); + + glDeleteShader(s); + return 0; } return s; } + GLint build_program(const string &name, GLint vs, GLint fs) { + GLint p = glCreateProgram(); + glAttachShader(p, vs); + glAttachShader(p, fs); + glLinkProgram(p); + + GLint stat; + glGetProgramiv(p, GL_LINK_STATUS, &stat); + if (!stat) { + GLint log_len; + glGetShaderiv(p, GL_INFO_LOG_LENGTH, &log_len); + char log[log_len]; + glGetProgramInfoLog(p, log_len, nullptr, log); + fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); + + glDeleteProgram(p); + return 0; + } + + return p; + } + public: void init() override { auto vs = build_shader(GL_VERTEX_SHADER, "vertex", "#version 400\n" - "" "void main(){" - " int" + " float x = gl_VertexID % 2;" + " float y = gl_VertexID / 2;" + " gl_Position = vec4(x, y, 0, 1);" "}"); auto fs = build_shader(GL_FRAGMENT_SHADER, "fragment", "#version 400\n" - "" "void main(){" - " int" + " gl_FragColor = vec4(0, 1, 1, 0);" "}" ); - program = glCreateProgram(); - glAttachShader(program, vs); - glAttachShader(program, fs); - glLinkProgram(program); + program = build_program("main", vs, fs); + + glGenVertexArrays(1, &vao); } void render() override { + int w, h; + getBounds(w, h); + glViewport(0, 0, w, h); + glBindVertexArray(vao); + glUseProgram(program); + glDrawArrays(GL_TRIANGLES, 0, 3); + + swapbuffers(); + } + + void deinit() override { + glDeleteProgram(program); + glDeleteVertexArrays(1, &vao); } };