-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathshaderprogram.cpp
More file actions
147 lines (117 loc) · 4.39 KB
/
shaderprogram.cpp
File metadata and controls
147 lines (117 loc) · 4.39 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
Niniejszy program jest wolnym oprogramowaniem; mo¿esz go
rozprowadzaæ dalej i / lub modyfikowaæ na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundacjê Wolnego
Oprogramowania - wed³ug wersji 2 tej Licencji lub(wed³ug twojego
wyboru) którejœ z póŸniejszych wersji.
Niniejszy program rozpowszechniany jest z nadziej¹, i¿ bêdzie on
u¿yteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyœlnej
gwarancji PRZYDATNOŒCI HANDLOWEJ albo PRZYDATNOŒCI DO OKREŒLONYCH
ZASTOSOWAÑ.W celu uzyskania bli¿szych informacji siêgnij do
Powszechnej Licencji Publicznej GNU.
Z pewnoœci¹ wraz z niniejszym programem otrzyma³eœ te¿ egzemplarz
Powszechnej Licencji Publicznej GNU(GNU General Public License);
jeœli nie - napisz do Free Software Foundation, Inc., 59 Temple
Place, Fifth Floor, Boston, MA 02110 - 1301 USA
*/
#include "shaderprogram.h"
//Procedura wczytuje plik do tablicy znaków.
char* ShaderProgram::readFile(const char* fileName) {
int filesize;
FILE *plik;
char* result;
plik=fopen(fileName,"rb");
fseek(plik,0,SEEK_END);
filesize=ftell(plik);
fseek(plik,0,SEEK_SET);
result=new char[filesize+1];
fread(result,1,filesize,plik);
result[filesize]=0;
fclose(plik);
return result;
}
//Metoda wczytuje i kompiluje shader, a nastêpnie zwraca jego uchwyt
GLuint ShaderProgram::loadShader(GLenum shaderType,const char* fileName) {
//Wygeneruj uchwyt na shader
GLuint shader=glCreateShader(shaderType);//shaderType to GL_VERTEX_SHADER, GL_GEOMETRY_SHADER lub GL_FRAGMENT_SHADER
//Wczytaj plik ze Ÿród³em shadera do tablicy znaków
const GLchar* shaderSource=readFile(fileName);
//Powi¹¿ Ÿród³o z uchwytem shadera
glShaderSource(shader,1,&shaderSource,NULL);
//Skompiluj Ÿród³o
glCompileShader(shader);
//Usuñ Ÿród³o shadera z pamiêci (nie bêdzie ju¿ potrzebne)
delete []shaderSource;
//Pobierz log b³êdów kompilacji i wyœwietl
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;
}
//Zwróæ uchwyt wygenerowanego shadera
return shader;
}
ShaderProgram::ShaderProgram(const char* vertexShaderFile,const char* geometryShaderFile,const char* fragmentShaderFile) {
//Wczytaj vertex shader
printf("Loading vertex shader...\n");
vertexShader=loadShader(GL_VERTEX_SHADER,vertexShaderFile);
//Wczytaj geometry shader
if (geometryShaderFile!=NULL) {
printf("Loading geometry shader...\n");
geometryShader=loadShader(GL_GEOMETRY_SHADER,geometryShaderFile);
} else {
geometryShader=0;
}
//Wczytaj fragment shader
printf("Loading fragment shader...\n");
fragmentShader=loadShader(GL_FRAGMENT_SHADER,fragmentShaderFile);
//Wygeneruj uchwyt programu cieniuj¹cego
shaderProgram=glCreateProgram();
//Pod³¹cz do niego shadery i zlinkuj program
glAttachShader(shaderProgram,vertexShader);
glAttachShader(shaderProgram,fragmentShader);
if (geometryShaderFile!=NULL) glAttachShader(shaderProgram,geometryShader);
glLinkProgram(shaderProgram);
//Pobierz log b³êdów linkowania i wyœwietl
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() {
//Od³¹cz shadery od programu
glDetachShader(shaderProgram, vertexShader);
if (geometryShader!=0) glDetachShader(shaderProgram, geometryShader);
glDetachShader(shaderProgram, fragmentShader);
//Wykasuj shadery
glDeleteShader(vertexShader);
if (geometryShader!=0) glDeleteShader(geometryShader);
glDeleteShader(fragmentShader);
//Wykasuj program
glDeleteProgram(shaderProgram);
}
//W³¹cz u¿ywanie programu cieniuj¹cego reprezentowanego przez aktualny obiekt
void ShaderProgram::use() {
glUseProgram(shaderProgram);
}
//Pobierz numer slotu odpowiadaj¹cego zmiennej jednorodnej o nazwie variableName
GLuint ShaderProgram::u(const char* variableName) {
return glGetUniformLocation(shaderProgram,variableName);
}
//Pobierz numer slotu odpowiadaj¹cego atrybutowi o nazwie variableName
GLuint ShaderProgram::a(const char* variableName) {
return glGetAttribLocation(shaderProgram,variableName);
}