-
Notifications
You must be signed in to change notification settings - Fork 18
/
shaders.c
108 lines (91 loc) · 2.79 KB
/
shaders.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// how to set up a shader in OpenGL (C)
// includes sample shaders: base, gouraud, phong, texture-g, texture-p, & toon
// shader variables
GLuint v0, f0, p0;
GLint p0t;
// first, must read in the shader
char* readShader(const char *filename){
// try to open shader file contents
FILE *file = fopen(filename, "r");
char *contents;
int count = 0;
// if missing file
if(!file){
fprintf(stderr, "Unable to open %s\n", filename);
return NULL;
}
// prepare content to be read
fseek(file, 0, SEEK_END);
count = ftell(file);
rewind(file);
// read content into memory
if(count > 0){
contents = (char *) malloc(sizeof(char) * (count + 1));
count = fread(contents, sizeof(char), count, file);
contents[count] = '\0';
}
// clean-up
fclose(file);
return contents;
}
// then, must create all shader programs
void createShaders(){
// info log variables
GLint Result = GL_FALSE;
int InfoLogLength;
//
// p0 - base shader (flat shading)
//
// store file contents
char *vs0, *fs0;
// initialize shaders
v0 = glCreateShader(GL_VERTEX_SHADER);
f0 = glCreateShader(GL_FRAGMENT_SHADER);
// load shaders from file
vs0 = readShader("base.vert");
fs0 = readShader("base.frag");
const char * vv0 = vs0;
const char * ff0 = fs0;
glShaderSource(v0, 1, &vv0, NULL);
glShaderSource(f0, 1, &ff0, NULL);
free(vs0);
free(fs0);
// compile shaders & log errors
glCompileShader(v0);
glGetShaderiv(v0, GL_COMPILE_STATUS, &Result);
glGetShaderiv(v0, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> VertexShaderErrorMessage0(InfoLogLength);
glGetShaderInfoLog(v0, InfoLogLength, NULL, &VertexShaderErrorMessage0[0]);
fprintf(stdout, "%s\n", &VertexShaderErrorMessage0[0]);
glCompileShader(f0);
glGetShaderiv(f0, GL_COMPILE_STATUS, &Result);
glGetShaderiv(f0, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> FragmentShaderErrorMessage0(InfoLogLength);
glGetShaderInfoLog(f0, InfoLogLength, NULL, &FragmentShaderErrorMessage0[0]);
fprintf(stdout, "%s\n", &FragmentShaderErrorMessage0[0]);
// create shader programs & log errors
p0 = glCreateProgram();
glAttachShader(p0, v0);
glAttachShader(p0, f0);
glLinkProgram(p0);
glGetProgramiv(p0, GL_LINK_STATUS, &Result);
glGetProgramiv(p0, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ProgramErrorMessage0(max(InfoLogLength, int(1)));
fprintf(stdout, "%s\n", &ProgramErrorMessage0[0]);
// add program variable
p0t = glGetUniformLocation(p0, "t");
// clear shaders
glDeleteShader(v0);
glDeleteShader(f0);
}
// how to enable a shader program
// how to set shader variables
void setShader(){
if(true){
glUseProgram(p0);
glUniform1f(p0t, someVariable);
}else{
glUseProgram(p0);
glUniform1f(p0t, someOtherVariable);
}
}