-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathshaderbuilder.cpp
More file actions
117 lines (84 loc) · 3.04 KB
/
shaderbuilder.cpp
File metadata and controls
117 lines (84 loc) · 3.04 KB
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
109
110
111
112
113
114
115
116
#include "shaderbuilder.h"
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define DEBUG_SHADERS 1
std::string readFile(const char *filePath) {
std::string content;
std::ifstream fileStream(filePath, std::ios::in);
if(!fileStream.is_open()) {
std::cerr << "Could not read file " << filePath << ". File does not exist." << std::endl;
return "";
}
std::string line = "";
while(!fileStream.eof()) {
std::getline(fileStream, line);
content.append(line + "\n");
}
fileStream.close();
return content;
}
std::string replaceFlags(std::string orig, int valency) {
size_t index = orig.find("/* VLFLAG */");
if (index != std::string::npos) {
std::string replacement = " " + std::to_string(valency);
orig.replace(index, 12, replacement);
}
return orig;
}
ShaderBuilder::ShaderBuilder() {
}
GLuint ShaderBuilder::compileShader(const char* location, GLuint shaderType) {
std::string text = readFile(location);
const char *src = text.c_str();
GLuint shader = glCreateShader(shaderType);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
GLint shaderCompiled = GL_FALSE;
glGetShaderiv(shader, GL_COMPILE_STATUS, &shaderCompiled );
if(DEBUG_SHADERS && !shaderCompiled)
std::cout << shaderCompiled << " " << shaderType << std::endl;
GLint logLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
if(logLength > 0) {
std::vector<char> shaderError((logLength > 1) ? logLength : 1);
glGetShaderInfoLog(shader, logLength, NULL, &shaderError[0]);
if(DEBUG_SHADERS)
std::cout << &shaderError[0] << std::endl;
}
return shader;
}
void ShaderBuilder::linkProgram(GLuint program) {
glLinkProgram(program);
GLint programLinked = GL_FALSE;
glGetProgramiv( program, GL_LINK_STATUS, &programLinked );
if(DEBUG_SHADERS && !programLinked)
std::cout << programLinked << " program" << std::endl;
GLint logLength;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
if(logLength > 0) {
std::vector<char> programError((logLength > 1) ? logLength : 1);
glGetProgramInfoLog(program, logLength, NULL, &programError[0]);
if(DEBUG_SHADERS)
std::cout << &programError[0] << std::endl;
}
GLint error = glGetError();
if(error) {
std::cout << "render errors " << error << std::endl;
}
}
GLuint ShaderBuilder::createShaderProgram(const char* vertShaderLoc, const char* fragShaderLoc) {
GLuint vertShader = compileShader(vertShaderLoc, GL_VERTEX_SHADER);
GLuint fragShader = compileShader(fragShaderLoc, GL_FRAGMENT_SHADER);
GLuint program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
linkProgram(program);
glDetachShader(program, vertShader);
glDetachShader(program, fragShader);
glDeleteShader(vertShader);
glDeleteShader(fragShader);
return program;
}