summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward O'Callaghan <funfunctor@folklore1984.net>2017-02-27 17:56:36 +1100
committerEdward O'Callaghan <funfunctor@folklore1984.net>2017-02-27 17:56:36 +1100
commit588ef0fd724e4097d6df70c0ec1bb10f6f3fac16 (patch)
treeffc430b7a75c7ccbd52e217b598c1d956bd67261
parent64c8e3a305ce8ca5bb35ee7f219c41882acab011 (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.c81
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);