/
load_shaders.cpp
97 lines (90 loc) · 3.14 KB
/
load_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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "glCanvas.h"
#include <iostream>
#include <fstream>
#include "argparser.h"
void CheckForGLSL() {
#if _WIN32
// Missing code for the Windows equivalent :(
#else
const GLubyte* extensions = glGetString(GL_EXTENSIONS);
if (!gluCheckExtension((const GLubyte*)"GL_ARB_shader_objects", extensions) ||
!gluCheckExtension((const GLubyte*)"GL_ARB_vertex_shader", extensions) ||
!gluCheckExtension((const GLubyte*)"GL_ARB_fragment_shader", extensions) ||
!gluCheckExtension((const GLubyte*)"GL_ARB_shading_language_100", extensions)) {
std::cout << glGetString(GL_RENDERER) << " does not support GLSL" << std::endl;
exit(1);
}
#endif
}
void CompileProgram(GLcharARB* sourcecode, GLhandleARB *shader) {
GLint logLength;
GLint compiled;
glShaderSourceARB(*shader,1,(const GLcharARB **)&sourcecode,0);
HandleGLError("Failed glShaderSourceARB");
glCompileShaderARB(*shader);
HandleGLError("Failed glCompileShaderARB");
glGetObjectParameterivARB(*shader,GL_OBJECT_COMPILE_STATUS_ARB,&compiled);
glGetObjectParameterivARB(*shader,GL_OBJECT_INFO_LOG_LENGTH_ARB,&logLength);
if (logLength) {
GLcharARB *log = (GLcharARB *)malloc(logLength+128);
glGetInfoLogARB(*shader, logLength, &logLength, log);
printf("Compile log: \n");
free (log);
}
if (!compiled) {
std::cout << "shader could not compile" << std::endl;
exit(0);
}
}
void LinkProgram(GLhandleARB program) {
GLint logLength;
GLint linked;
glLinkProgramARB(program);
HandleGLError("Failed glLinkProgramARB");
glGetObjectParameterivARB(program,GL_OBJECT_LINK_STATUS_ARB,&linked);
glGetObjectParameterivARB(program,GL_OBJECT_INFO_LOG_LENGTH_ARB,&logLength);
if (logLength) {
GLint charsWritten;
GLcharARB *log = (GLcharARB*)malloc(logLength+128);
glGetInfoLogARB(program, logLength, &charsWritten, log);
printf("Link GetInfoLogARB:\n%s\n",log);
free (log);
}
if (!linked) {
std::cout << "shader did not link" << std::endl;
exit(0);
}
}
std::string ReadFile(const std::string &filename) {
std::string answer;
std::ifstream file(filename.c_str());
assert (file);
std::string s;
while (getline(file,s)) {
answer += s + "\n";
}
return answer;
}
void GLCanvas::InitShaders() {
std::cout << "initialize shaders" << std::endl;
CheckForGLSL();
program = glCreateProgramObjectARB();
vertex_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
fragment_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
HandleGLError("Failed to create program or shader objects");
glAttachObjectARB(program,vertex_shader);
glAttachObjectARB(program,fragment_shader);
HandleGLError("Failed to attach shaders to program");
}
GLuint GLCanvas::LoadCompileLinkShaders() {
std::cout << "load, compile, & link shaders" << std::endl;
std::string v_string = ReadFile("shadows.vs");
char *v = (char*) v_string.c_str();
std::string f_string = ReadFile("shadows.fs");
char *f = (char*) f_string.c_str();
CompileProgram(v, &vertex_shader);
CompileProgram(f, &fragment_shader);
LinkProgram(program);
HandleGLError("Failed to compile or link shaders");
return glGetUniformLocationARB(program,"ShadowMap");
}