-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrenderer.c
87 lines (73 loc) · 1.85 KB
/
renderer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// vim: ts=4 sw=4 noet cc=80
#include <epoxy/gl.h>
#include <stdio.h>
#include <stdlib.h>
#include "renderer.h"
#include "util.h"
// Initialize a vertex buffer object
void vboinit(GLsizeiptr size, const GLvoid *data)
{
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
}
// Initialize a vertex array object
void vaoinit(GLuint index, GLint size, GLsizei stride)
{
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
}
// Print GL information
void print_gl_info(void)
{
printf(
"GL Vendor: %s\n"
"GL Renderer: %s\n"
"GL Version: %s\n"
"GLSL Version: %s\n",
glGetString(GL_VENDOR),
glGetString(GL_RENDERER),
glGetString(GL_VERSION),
glGetString(GL_SHADING_LANGUAGE_VERSION)
);
}
// Make a shader from a source file
GLuint makeshader(const GLenum type, const char path[])
{
// Read shader source in
const GLchar *src = (const GLchar *)readfile(path);
if (!src) return 0;
// Make shader
GLuint shader = glCreateShader(type);
// Build shader
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
// Check the build
GLint result;
glGetShaderiv(shader, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE) {
GLint length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
// Print that error occured
fprintf(stderr, "Failed to compile shader: %s\n", path);
// Make char array for log msg
GLchar *msg = (GLchar *)malloc(sizeof(GLchar) * length);
if (!msg) {
perror("ERROR");
fputs("Failed to allocate memory for log\n", stderr);
glDeleteShader(shader);
return 0;
}
// Read log into msg
glGetShaderInfoLog(shader, length, &length, msg);
fputs(msg, stderr);
free(msg);
glDeleteShader(shader);
return 0;
}
return shader;
}