-
Notifications
You must be signed in to change notification settings - Fork 0
/
shaders.cpp
80 lines (70 loc) · 2.02 KB
/
shaders.cpp
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
#include <iostream>
#include <fstream>
#include <string.h>
#include <GL/glut.h>
#include <GL/glext.h>
using namespace std;
string textFileRead(const char * filename) {
string str, ret = "";
ifstream in ; in .open(filename);
if ( in .is_open()) {
getline( in , str);
while ( in ) {
ret += str + "\n";
getline( in , str);
}
return ret;
} else {
cerr << "Unable to Open File " << filename << "\n";
throw 2;
}
}
void programerrors(const GLint program) {
GLint length;
GLchar * log;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, & length);
log = new GLchar[length + 1];
glGetProgramInfoLog(program, length, & length, log);
cout << "Compile Error, Log Below\n" << log << "\n";
delete[] log;
}
void shadererrors(const GLint shader) {
GLint length;
GLchar * log;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, & length);
log = new GLchar[length + 1];
glGetShaderInfoLog(shader, length, & length, log);
cout << "Compile Error, Log Below\n" << log << "\n";
delete[] log;
}
GLuint initshaders(GLenum type,
const char * filename) {
GLuint shader = glCreateShader(type);
GLint compiled;
string str = textFileRead(filename);
GLchar * cstr = new GLchar[str.size() + 1];
const GLchar * cstr2 = cstr; // Weirdness to get a const char
strcpy(cstr, str.c_str());
glShaderSource(shader, 1, & cstr2, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, & compiled);
if (!compiled) {
shadererrors(shader);
throw 3;
}
return shader;
}
GLuint initprogram(GLuint vertexshader, GLuint fragmentshader) {
GLuint program = glCreateProgram();
GLint linked;
glAttachShader(program, vertexshader);
glAttachShader(program, fragmentshader);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, & linked);
if (linked) glUseProgram(program);
else {
programerrors(program);
throw 4;
}
return program;
}