Repository navigation
Expand file tree
/
Copy pathshaderprogram.cpp
More file actions
112 lines (86 loc) · 2.93 KB
/
Copy pathshaderprogram.cpp
File metadata and controls
112 lines (86 loc) · 2.93 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
#include "shaderprogram.h"
#pragma warning(disable : 4996)
char* ShaderProgram::readFile(const char* fileName) {
int filesize;
FILE* plik;
char* result;
plik = fopen(fileName, "rb");
if (plik != NULL) {
fseek(plik, 0, SEEK_END);
filesize = ftell(plik);
fseek(plik, 0, SEEK_SET);
result = new char[filesize + 1];
#pragma warning(suppress : 6386)
int readsize = fread(result, 1, filesize, plik);
result[filesize] = 0;
fclose(plik);
return result;
}
return NULL;
}
GLuint ShaderProgram::loadShader(GLenum shaderType, const char* fileName) {
GLuint shader = glCreateShader(shaderType); //GL_VERTEX_SHADER, GL_GEOMETRY_SHADER GL_FRAGMENT_SHADER
const GLchar* shaderSource = readFile(fileName);
glShaderSource(shader, 1, &shaderSource, NULL);
glCompileShader(shader);
delete[]shaderSource;
int infologLength = 0;
int charsWritten = 0;
char* infoLog;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 1) {
infoLog = new char[infologLength];
glGetShaderInfoLog(shader, infologLength, &charsWritten, infoLog);
printf("%s\n", infoLog);
delete[]infoLog;
}
return shader;
}
ShaderProgram::ShaderProgram(const char* vertexShaderFile, const char* geometryShaderFile, const char* fragmentShaderFile) {
printf("Loading vertex shader from: %s\n", vertexShaderFile);
vertexShader = loadShader(GL_VERTEX_SHADER, vertexShaderFile);
if (geometryShaderFile != NULL) {
printf("Loading geometry shader from: %s\n", geometryShaderFile);
geometryShader = loadShader(GL_GEOMETRY_SHADER, geometryShaderFile);
}
else {
geometryShader = 0;
}
printf("Loading fragment shader from: %s\n", fragmentShaderFile);
fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentShaderFile);
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
if (geometryShaderFile != NULL) glAttachShader(shaderProgram, geometryShader);
glLinkProgram(shaderProgram);
int infologLength = 0;
int charsWritten = 0;
char* infoLog;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 1)
{
infoLog = new char[infologLength];
glGetProgramInfoLog(shaderProgram, infologLength, &charsWritten, infoLog);
printf("%s\n", infoLog);
delete[]infoLog;
}
printf("Shader program created\n");
}
ShaderProgram::~ShaderProgram() {
glDetachShader(shaderProgram, vertexShader);
if (geometryShader != 0) glDetachShader(shaderProgram, geometryShader);
glDetachShader(shaderProgram, fragmentShader);
glDeleteShader(vertexShader);
if (geometryShader != 0) glDeleteShader(geometryShader);
glDeleteShader(fragmentShader);
glDeleteProgram(shaderProgram);
}
void ShaderProgram::use() {
glUseProgram(shaderProgram);
}
GLuint ShaderProgram::u(const char* variableName) {
return glGetUniformLocation(shaderProgram, variableName);
}
GLuint ShaderProgram::a(const char* variableName) {
return glGetAttribLocation(shaderProgram, variableName);
}