diff options
author | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-02-27 17:56:36 +1100 |
---|---|---|
committer | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-02-27 17:56:36 +1100 |
commit | 588ef0fd724e4097d6df70c0ec1bb10f6f3fac16 (patch) | |
tree | ffc430b7a75c7ccbd52e217b598c1d956bd67261 | |
parent | 64c8e3a305ce8ca5bb35ee7f219c41882acab011 (diff) |
src/gl_minimal.c: Make GL example really fancy now
Show GL is working for real with some sinnyness!!!
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
-rw-r--r-- | src/gl_minimal.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/gl_minimal.c b/src/gl_minimal.c index 3898230..0e9d418 100644 --- a/src/gl_minimal.c +++ b/src/gl_minimal.c @@ -1,6 +1,7 @@ #include <epoxy/gl.h> #include <epoxy/glx.h> +#include <assert.h> #include <unistd.h> #include <stdio.h> @@ -42,6 +43,86 @@ void run_gl_example(struct display * d) sleep(3); } + const GLfloat vertices[] = { + 0.0f, 0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + -0.5f, -0.5f, 0.0f + }; + + GLuint vao, vbo; + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vbo); + + glBindVertexArray(vao); + + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + const char* vertex_shader = + "#version 130\n" + "in vec3 position;" + "void main() {" + " gl_Position = vec4(position.x, position.y, position.z, 1.0);" + "}"; + + const char* fragment_shader = + "#version 130\n" + "out vec4 frag_colour;" + "void main() {" + " frag_colour = vec4(1.0f, 0.5f, 0.2f, 1.0f);" + "}"; + + GLint success; + GLchar infoLog[512]; + + GLuint vs = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vs, 1, &vertex_shader, NULL); + glCompileShader(vs); + glGetShaderiv(vs, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(vs, 512, NULL, infoLog); + printf("%s\n", infoLog); + assert(0); + } + + GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fs, 1, &fragment_shader, NULL); + glCompileShader(fs); + glGetShaderiv(fs, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fs, 512, NULL, infoLog); + printf("%s\n", infoLog); + assert(0); + } + + GLuint shader_programme = glCreateProgram(); + glAttachShader(shader_programme, fs); + glAttachShader(shader_programme, vs); + glLinkProgram(shader_programme); + glDeleteShader(vs); + glDeleteShader(fs); + + glClearColor(0.3,0.3,0.3, 1.0); + // wipe the drawing surface clear + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glBindVertexArray(vao); + glUseProgram(shader_programme); + // draw points 0-3 from the currently bound VAO with current in-use shader + glDrawArrays(GL_TRIANGLES, 0, 3); + glBindVertexArray(0); + + glFlush(); + sleep(3); + + glDeleteVertexArrays(1, &vao); + glDeleteBuffers(1, &vbo); + // sleep(2); // eglSwapBuffers(d->egl.display, d->egl.surface); // sleep(2); |