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
|
U32 compile_shader(GLenum type, Str8 filename)
{
Arena *tmp = arena_alloc(0);
Str8 src = str8_read_entire_file(tmp, filename);
if (!src.ptr || !src.length) {
str8print(str8_pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename)));
arena_release(tmp);
return 0;
}
const char *csrc = str8_to_cstr(tmp, src);
U32 id = glCreateShader(type);
glShaderSource(id, 1, &csrc, 0);
glCompileShader(id);
S32 status;
glGetShaderiv(id, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
char log[512];
glGetShaderInfoLog(id, 512, 0, log);
str8print(str8_pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log));
} else {
str8print(str8_pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename)));
}
arena_release(tmp);
return id;
}
U32 create_shader_program(Str8 vert_filename, Str8 frag_filename)
{
U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename);
U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename);
Arena *tmp = arena_alloc(0);
U32 id = glCreateProgram();
glAttachShader(id, vert);
glAttachShader(id, frag);
glLinkProgram(id);
S32 success;
glGetProgramiv(id, GL_LINK_STATUS, &success);
if (success == GL_FALSE) {
char log[512];
glGetProgramInfoLog(id, 512, 0, log);
str8print(str8_pushf(tmp, "[ERROR]: Failed to link shader program:\n%s", log));
} else {
str8print(str8_pushf(tmp, "[INFO]: Shader program linked successfuly.\n\n"));
}
glDeleteShader(vert);
glDeleteShader(frag);
arena_release(tmp);
return id;
}
void shader_set_mat4fv(U32 id, char *name, Mat4 m)
{
S32 loc = glGetUniformLocation(id, name);
glUniformMatrix4fv(loc, 1, 0, (F32 *)&m);
}
|