1
/************************************************************************************
3
AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
4
Copyright © 2006-2012 Michael Kurinnoy, Viewizard
7
AstroMenace is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
12
AstroMenace is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
21
Web Site: http://www.viewizard.com/
22
Project: http://sourceforge.net/projects/openastromenace/
23
E-mail: viewizard@viewizard.com
25
*************************************************************************************/
28
#include "RendererInterface.h"
29
extern eDevCaps OpenGL_DevCaps;
33
// GL_ARB_shader_objects
34
PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL;
35
PFNGLGETHANDLEARBPROC glGetHandleARB = NULL;
36
PFNGLDETACHOBJECTARBPROC glDetachObjectARB = NULL;
37
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
38
PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
39
PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
40
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
41
PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
42
PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
43
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
44
PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB = NULL;
45
PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
46
PFNGLUNIFORM2FARBPROC glUniform2fARB = NULL;
47
PFNGLUNIFORM3FARBPROC glUniform3fARB = NULL;
48
PFNGLUNIFORM4FARBPROC glUniform4fARB = NULL;
49
PFNGLUNIFORM1IARBPROC glUniform1iARB = NULL;
50
PFNGLUNIFORM2IARBPROC glUniform2iARB = NULL;
51
PFNGLUNIFORM3IARBPROC glUniform3iARB = NULL;
52
PFNGLUNIFORM4IARBPROC glUniform4iARB = NULL;
53
PFNGLUNIFORM1FVARBPROC glUniform1fvARB = NULL;
54
PFNGLUNIFORM2FVARBPROC glUniform2fvARB = NULL;
55
PFNGLUNIFORM3FVARBPROC glUniform3fvARB = NULL;
56
PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL;
57
PFNGLUNIFORM1IVARBPROC glUniform1ivARB = NULL;
58
PFNGLUNIFORM2IVARBPROC glUniform2ivARB = NULL;
59
PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL;
60
PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL;
61
PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL;
62
PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL;
63
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL;
64
PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL;
65
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
66
PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
67
PFNGLGETATTACHEDOBJECTSARBPROC glGetAttachedObjectsARB = NULL;
68
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
69
PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB = NULL;
70
PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB = NULL;
71
PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL;
72
PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL;
75
// GL_ARB_vertex_shader
76
PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = NULL;
77
PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL;
78
PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL;
82
eGLSL *StartGLSLMan = 0;
83
eGLSL *EndGLSLMan = 0;
100
//------------------------------------------------------------------------------------
101
// иним и подключаем все указатели
102
//------------------------------------------------------------------------------------
103
bool vw_Internal_InitializationGLSL()
105
// GL_ARB_shader_objects
106
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB");
107
glGetHandleARB = (PFNGLGETHANDLEARBPROC) SDL_GL_GetProcAddress("glGetHandleARB");
108
glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) SDL_GL_GetProcAddress("glDetachObjectARB");
109
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB");
110
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB");
111
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB");
112
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB");
113
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB");
114
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB");
115
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB");
116
glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) SDL_GL_GetProcAddress("glValidateProgramARB");
117
glUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB");
118
glUniform2fARB = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB");
119
glUniform3fARB = (PFNGLUNIFORM3FARBPROC) SDL_GL_GetProcAddress("glUniform3fARB");
120
glUniform4fARB = (PFNGLUNIFORM4FARBPROC) SDL_GL_GetProcAddress("glUniform4fARB");
121
glUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB");
122
glUniform2iARB = (PFNGLUNIFORM2IARBPROC) SDL_GL_GetProcAddress("glUniform2iARB");
123
glUniform3iARB = (PFNGLUNIFORM3IARBPROC) SDL_GL_GetProcAddress("glUniform3iARB");
124
glUniform4iARB = (PFNGLUNIFORM4IARBPROC) SDL_GL_GetProcAddress("glUniform4iARB");
125
glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) SDL_GL_GetProcAddress("glUniform1fvARB");
126
glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) SDL_GL_GetProcAddress("glUniform2fvARB");
127
glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) SDL_GL_GetProcAddress("glUniform3fvARB");
128
glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) SDL_GL_GetProcAddress("glUniform4fvARB");
129
glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) SDL_GL_GetProcAddress("glUniform1ivARB");
130
glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) SDL_GL_GetProcAddress("glUniform2ivARB");
131
glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) SDL_GL_GetProcAddress("glUniform3ivARB");
132
glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) SDL_GL_GetProcAddress("glUniform4ivARB");
133
glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix2fvARB");
134
glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix3fvARB");
135
glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix4fvARB");
136
glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterfvARB");
137
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB");
138
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB");
139
glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) SDL_GL_GetProcAddress("glGetAttachedObjectsARB");
140
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB");
141
glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) SDL_GL_GetProcAddress("glGetActiveUniformARB");
142
glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) SDL_GL_GetProcAddress("glGetUniformfvARB");
143
glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) SDL_GL_GetProcAddress("glGetUniformivARB");
144
glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glGetShaderSourceARB");
146
// GL_ARB_vertex_shader
147
glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glBindAttribLocationARB");
148
glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) SDL_GL_GetProcAddress("glGetActiveAttribARB");
149
glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetAttribLocationARB");
151
// инициализация менеджера
157
if (glDeleteObjectARB == NULL || glGetHandleARB == NULL || glDetachObjectARB == NULL || glCreateShaderObjectARB == NULL ||
158
glShaderSourceARB == NULL || glCompileShaderARB == NULL || glCreateProgramObjectARB == NULL || glAttachObjectARB == NULL ||
159
glLinkProgramARB == NULL || glUseProgramObjectARB == NULL || glValidateProgramARB == NULL || glUniform1fARB == NULL ||
160
glUniform2fARB == NULL || glUniform3fARB == NULL || glUniform4fARB == NULL || glUniform1iARB == NULL ||
161
glUniform2iARB == NULL || glUniform3iARB == NULL || glUniform4iARB == NULL || glUniform1fvARB == NULL ||
162
glUniform2fvARB == NULL || glUniform3fvARB == NULL || glUniform4fvARB == NULL || glUniform1ivARB == NULL ||
163
glUniform2ivARB == NULL || glUniform3ivARB == NULL || glUniform4ivARB == NULL || glUniformMatrix2fvARB == NULL ||
164
glUniformMatrix3fvARB == NULL || glUniformMatrix4fvARB == NULL || glGetObjectParameterfvARB == NULL ||
165
glGetObjectParameterivARB == NULL || glGetInfoLogARB == NULL || glGetAttachedObjectsARB == NULL ||
166
glGetUniformLocationARB == NULL || glGetActiveUniformARB == NULL || glGetUniformfvARB == NULL || glGetUniformivARB == NULL ||
167
glGetShaderSourceARB == NULL || glBindAttribLocationARB == NULL || glGetActiveAttribARB == NULL || glGetAttribLocationARB == NULL)
169
glDeleteObjectARB = NULL;
170
glGetHandleARB = NULL;
171
glDetachObjectARB = NULL;
172
glCreateShaderObjectARB = NULL;
173
glShaderSourceARB = NULL;
174
glCompileShaderARB = NULL;
175
glCreateProgramObjectARB = NULL;
176
glAttachObjectARB = NULL;
177
glLinkProgramARB = NULL;
178
glUseProgramObjectARB = NULL;
179
glValidateProgramARB = NULL;
180
glUniform1fARB = NULL;
181
glUniform2fARB = NULL;
182
glUniform3fARB = NULL;
183
glUniform4fARB = NULL;
184
glUniform1iARB = NULL;
185
glUniform2iARB = NULL;
186
glUniform3iARB = NULL;
187
glUniform4iARB = NULL;
188
glUniform1fvARB = NULL;
189
glUniform2fvARB = NULL;
190
glUniform3fvARB = NULL;
191
glUniform4fvARB = NULL;
192
glUniform1ivARB = NULL;
193
glUniform2ivARB = NULL;
194
glUniform3ivARB = NULL;
195
glUniform4ivARB = NULL;
196
glUniformMatrix2fvARB = NULL;
197
glUniformMatrix3fvARB = NULL;
198
glUniformMatrix4fvARB = NULL;
199
glGetObjectParameterfvARB = NULL;
200
glGetObjectParameterivARB = NULL;
201
glGetInfoLogARB = NULL;
202
glGetAttachedObjectsARB = NULL;
203
glGetUniformLocationARB = NULL;
204
glGetActiveUniformARB = NULL;
205
glGetUniformfvARB = NULL;
206
glGetUniformivARB = NULL;
207
glGetShaderSourceARB = NULL;
208
glBindAttribLocationARB = NULL;
209
glGetActiveAttribARB = NULL;
210
glGetAttribLocationARB = NULL;
222
//------------------------------------------------------------------------------------
224
//------------------------------------------------------------------------------------
227
// Returns 1 if an OpenGL error occurred, 0 otherwise.
231
glErr = glGetError();
232
while (glErr != GL_NO_ERROR)
234
fprintf(stderr, "glError 0x%x %s\n", glErr, gluErrorString(glErr));
236
glErr = glGetError();
242
//------------------------------------------------------------------------------------
243
// Print out the information log for a shader object
244
//------------------------------------------------------------------------------------
245
void vw_PrintShaderInfoLog(GLuint shader, const char *ShaderName)
247
if (glGetObjectParameterivARB == NULL) return;
248
if (glGetInfoLogARB == NULL) return;
250
int infologLength = 0;
251
int charsWritten = 0;
254
CheckOGLError(); // Check for OpenGL errors
256
glGetObjectParameterivARB(shader, GL_INFO_LOG_LENGTH, &infologLength);
258
CheckOGLError(); // Check for OpenGL errors
260
if (infologLength > 0)
262
infoLog = (GLchar *)malloc(infologLength);
265
fprintf(stderr, "ERROR: Could not allocate InfoLog buffer\n");
268
glGetInfoLogARB(shader, infologLength, &charsWritten, infoLog);
269
if (strlen(infoLog) >1)
270
printf("Shader InfoLog %s:\n%s\n\n", ShaderName, infoLog);
273
CheckOGLError(); // Check for OpenGL errors
277
void vw_PrintProgramInfoLog(GLuint program)
279
if (glGetObjectParameterivARB == NULL) return;
280
if (glGetInfoLogARB == NULL) return;
282
int infologLength = 0;
283
int charsWritten = 0;
286
CheckOGLError(); // Check for OpenGL errors
288
glGetObjectParameterivARB(program, GL_INFO_LOG_LENGTH, &infologLength);
290
CheckOGLError(); // Check for OpenGL errors
292
if (infologLength > 0)
294
infoLog = (GLchar *)malloc(infologLength);
297
printf("ERROR: Could not allocate InfoLog buffer\n");
300
glGetInfoLogARB(program, infologLength, &charsWritten, infoLog);
301
if (strlen(infoLog) >1)
302
printf("Program InfoLog:\n%s\n\n", infoLog);
305
CheckOGLError(); // Check for OpenGL errors
312
//------------------------------------------------------------------------------------
313
// освобождаем память
314
//------------------------------------------------------------------------------------
315
void vw_ReleaseShader(eGLSL *GLSL)
317
if (GLSL == 0) return;
318
if (glDetachObjectARB == NULL) return;
319
if (glDeleteObjectARB == NULL) return;
321
vw_DetachShader(GLSL);
323
// открепляем хидеры шейдеров
324
if (GLSL->VertexShaderUse) glDetachObjectARB(GLSL->Program, GLSL->VertexShader);
325
if (GLSL->FragmentShaderUse) glDetachObjectARB(GLSL->Program, GLSL->FragmentShader);
327
glDeleteObjectARB(GLSL->VertexShader);
328
glDeleteObjectARB(GLSL->FragmentShader);
329
glDeleteObjectARB(GLSL->Program);
331
if (GLSL->Name != 0){delete [] GLSL->Name; GLSL->Name = 0;}
334
delete GLSL; GLSL = 0;
344
//------------------------------------------------------------------------------------
345
// освобождаем все шейдеры подключенные к менеджеру
346
//------------------------------------------------------------------------------------
347
void vw_ReleaseAllShaders()
350
eGLSL *Tmp = StartGLSLMan;
353
eGLSL *Tmp1 = Tmp->Next;
354
vw_ReleaseShader(Tmp);
369
//------------------------------------------------------------------------------------
370
// подключение к менеджеру
371
//------------------------------------------------------------------------------------
372
void vw_AttachShader(eGLSL* GLSL)
374
if (GLSL == 0) return;
376
// первый в списке...
382
GLSL->Num = NumGLSLMan;
386
else // продолжаем заполнение...
388
GLSL->Prev = EndGLSLMan;
390
EndGLSLMan->Next = GLSL;
392
GLSL->Num = NumGLSLMan;
401
//------------------------------------------------------------------------------------
402
// отключение от менеджера
403
//------------------------------------------------------------------------------------
404
void vw_DetachShader(eGLSL* GLSL)
406
if (GLSL == 0) return;
408
// переустанавливаем указатели...
409
if (StartGLSLMan == GLSL) StartGLSLMan = GLSL->Next;
410
if (EndGLSLMan == GLSL) EndGLSLMan = GLSL->Prev;
413
if (GLSL->Next != 0) GLSL->Next->Prev = GLSL->Prev;
414
else if (GLSL->Prev != 0) GLSL->Prev->Next = 0;
415
if (GLSL->Prev != 0) GLSL->Prev->Next = GLSL->Next;
416
else if (GLSL->Next != 0) GLSL->Next->Prev = 0;
423
//------------------------------------------------------------------------------------
424
// Нахождение по уникальному номеру...
425
//------------------------------------------------------------------------------------
426
eGLSL* vw_FindShaderByNum(int Num)
428
eGLSL *Tmp = StartGLSLMan;
432
eGLSL *Tmp1 = Tmp->Next;
433
if (Tmp->Num == Num) return Tmp;
445
//------------------------------------------------------------------------------------
446
// Нахождение по имени...
447
//------------------------------------------------------------------------------------
448
eGLSL* vw_FindShaderByName(const char *Name)
450
eGLSL *Tmp = StartGLSLMan;
454
eGLSL *Tmp1 = Tmp->Next;
455
if( vw_strcmp(Tmp->Name, Name) == 0 ) return Tmp;
487
//------------------------------------------------------------------------------------
488
// создаем шейдерную программу
489
//------------------------------------------------------------------------------------
490
eGLSL *vw_CreateShader(const char *ShaderName, const char *VertexShaderFileName, const char *FragmentShaderFileName)
492
if (glCreateShaderObjectARB == NULL) return 0;
493
if (glShaderSourceARB == NULL) return 0;
494
if (glCompileShaderARB == NULL) return 0;
495
if (glCreateProgramObjectARB == NULL) return 0;
496
if (glAttachObjectARB == NULL) return 0;
497
if (glGetObjectParameterivARB == NULL) return 0;
498
if (VertexShaderFileName == 0 && FragmentShaderFileName == 0) return 0;
501
GLint vertCompiled, fragCompiled; // status values
503
// создаем структуру в памяти
506
if (GLSLtmp == 0) return 0;
508
// создаем пустые объекты и получаем хидеры на них
509
GLSLtmp->VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
510
GLSLtmp->FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
513
// загружаем данные в пустые шейдеры
515
// вертекстный шейдер
516
GLSLtmp->VertexShaderUse = false;
517
if (VertexShaderFileName != 0)
519
eFILE *VertexFile = 0;
520
VertexFile = vw_fopen(VertexShaderFileName);
524
const GLcharARB *TmpGLcharARB = (const GLcharARB *)VertexFile->Data;
525
glShaderSourceARB(GLSLtmp->VertexShader, 1, &TmpGLcharARB, &VertexFile->RealLength);
526
vw_fclose(VertexFile);
527
GLSLtmp->VertexShaderUse = true;
530
// фрагментный шейдер
531
GLSLtmp->FragmentShaderUse = false;
532
if (FragmentShaderFileName != 0)
534
eFILE *FragmentFile = 0;
535
FragmentFile = vw_fopen(FragmentShaderFileName);
537
if (FragmentFile != 0)
539
const GLcharARB *TmpGLcharARB = (const GLcharARB *)FragmentFile->Data;
540
glShaderSourceARB(GLSLtmp->FragmentShader, 1, &TmpGLcharARB, &FragmentFile->RealLength);
541
vw_fclose(FragmentFile);
542
GLSLtmp->FragmentShaderUse = true;
547
// компилируем шейдеры
549
if (GLSLtmp->VertexShaderUse)
551
glCompileShaderARB(GLSLtmp->VertexShader);
552
CheckOGLError(); // Check for OpenGL errors
553
glGetObjectParameterivARB(GLSLtmp->VertexShader, GL_COMPILE_STATUS, &vertCompiled);
554
vw_PrintShaderInfoLog(GLSLtmp->VertexShader, VertexShaderFileName);
556
if (!vertCompiled) return 0;
558
if (GLSLtmp->FragmentShaderUse)
560
glCompileShaderARB(GLSLtmp->FragmentShader);
561
CheckOGLError(); // Check for OpenGL errors
562
glGetObjectParameterivARB(GLSLtmp->FragmentShader, GL_COMPILE_STATUS, &fragCompiled);
563
vw_PrintShaderInfoLog(GLSLtmp->FragmentShader, FragmentShaderFileName);
565
if (!fragCompiled) return 0;
569
// создаем программу, чтобы подключить эти шейдеры
570
GLSLtmp->Program = glCreateProgramObjectARB();
571
if (GLSLtmp->VertexShaderUse) glAttachObjectARB(GLSLtmp->Program, GLSLtmp->VertexShader);
572
if (GLSLtmp->FragmentShaderUse) glAttachObjectARB(GLSLtmp->Program, GLSLtmp->FragmentShader);
575
if (VertexShaderFileName == 0)
576
printf("Shader ... %s\n", FragmentShaderFileName);
578
if (FragmentShaderFileName == 0)
579
printf("Shader ... %s\n", VertexShaderFileName);
581
printf("Shader ... %s %s\n", VertexShaderFileName, FragmentShaderFileName);
586
GLSLtmp->Name = new char[strlen(ShaderName)+1];
587
strcpy(GLSLtmp->Name, ShaderName);
591
GLSLtmp->Name = new char[strlen(VertexShaderFileName)+1];
592
strcpy(GLSLtmp->Name, VertexShaderFileName);
595
vw_AttachShader(GLSLtmp);
605
//------------------------------------------------------------------------------------
606
// линкуем программу, с учетом отбинденных данных
607
//------------------------------------------------------------------------------------
608
bool vw_LinkShaderProgram(eGLSL *GLSL)
610
if (GLSL == 0) return false;
611
if (glLinkProgramARB == NULL) return false;
612
if (glGetObjectParameterivARB == NULL) return false;
616
glLinkProgramARB(GLSL->Program);
617
CheckOGLError(); // Check for OpenGL errors
618
glGetObjectParameterivARB(GLSL->Program, GL_LINK_STATUS, &linked);
619
vw_PrintProgramInfoLog(GLSL->Program);
631
//------------------------------------------------------------------------------------
632
// запускаем шейдер на исполнение
633
//------------------------------------------------------------------------------------
634
bool vw_UseShaderProgram(eGLSL *GLSL)
636
if (GLSL == 0) return false;
637
if (glUseProgramObjectARB == NULL) return false;
639
glUseProgramObjectARB(GLSL->Program);
649
//------------------------------------------------------------------------------------
650
// останавливаем работу шейдера
651
//------------------------------------------------------------------------------------
652
bool vw_StopShaderProgram()
654
if (glUseProgramObjectARB == NULL) return false;
656
glUseProgramObjectARB(0);
666
//------------------------------------------------------------------------------------
667
// Get the location of a uniform variable
668
//------------------------------------------------------------------------------------
669
int vw_GetUniformLocation(eGLSL *GLSL, const char *name)
671
if (glGetUniformLocationARB == NULL) return -1;
675
loc = glGetUniformLocationARB(GLSL->Program, name);
678
fprintf(stderr, "No such uniform named \"%s\"\n", name);
680
CheckOGLError(); // Check for OpenGL errors
687
//------------------------------------------------------------------------------------
688
// установка значения параметра
689
//------------------------------------------------------------------------------------
690
bool vw_Uniform1i(eGLSL *GLSL, int UniformLocation, int data)
692
if (GLSL == 0) return false;
693
if (glUniform1iARB == NULL) return false;
695
glUniform1iARB(UniformLocation, data);
697
CheckOGLError(); // Check for OpenGL errors
701
bool vw_Uniform1i(eGLSL *GLSL, const char *name, int data)
703
if (GLSL == 0) return false;
704
if (name == 0) return false;
706
int Loc = vw_GetUniformLocation(GLSL, name);
707
if (Loc == -1) return false;
709
return vw_Uniform1i(GLSL, Loc, data);
713
bool vw_Uniform1f(eGLSL *GLSL, int UniformLocation, float data)
715
if (GLSL == 0) return false;
716
if (glUniform3fARB == NULL) return false;
718
glUniform1fARB(UniformLocation, data);
720
CheckOGLError(); // Check for OpenGL errors
724
bool vw_Uniform1f(eGLSL *GLSL, const char *name, float data)
726
if (GLSL == 0) return false;
727
if (name == 0) return false;
729
int Loc = vw_GetUniformLocation(GLSL, name);
730
if (Loc == -1) return false;
732
return vw_Uniform1f(GLSL, Loc, data);
736
bool vw_Uniform3f(eGLSL *GLSL, int UniformLocation, float data1, float data2, float data3)
738
if (GLSL == 0) return false;
739
if (glUniform3fARB == NULL) return false;
741
glUniform3fARB(UniformLocation, data1, data2, data3);
743
CheckOGLError(); // Check for OpenGL errors
747
bool vw_Uniform3f(eGLSL *GLSL, const char *name, float data1, float data2, float data3)
749
if (GLSL == 0) return false;
750
if (name == 0) return false;
752
int Loc = vw_GetUniformLocation(GLSL, name);
753
if (Loc == -1) return false;
755
return vw_Uniform3f(GLSL, Loc, data1, data2, data3);
759
bool vw_Uniform1fv(eGLSL *GLSL, int UniformLocation, int count, float *data)
761
if (GLSL == 0) return false;
762
if (glUniform1fvARB == NULL) return false;
764
glUniform1fvARB(UniformLocation, count, data);
766
CheckOGLError(); // Check for OpenGL errors
770
bool vw_Uniform1fv(eGLSL *GLSL, const char *name, int count, float *data)
772
if (GLSL == 0) return false;
773
if (name == 0) return false;
775
int Loc = vw_GetUniformLocation(GLSL, name);
776
if (Loc == -1) return false;
778
return vw_Uniform1fv(GLSL, Loc, count, data);
782
bool vw_Uniform4fv(eGLSL *GLSL, int UniformLocation, int count, float *data)
784
if (GLSL == 0) return false;
785
if (glUniform4fvARB == NULL) return false;
787
glUniform4fvARB(UniformLocation, count, data);
789
CheckOGLError(); // Check for OpenGL errors
793
bool vw_Uniform4fv(eGLSL *GLSL, const char *name, int count, float *data)
795
if (GLSL == 0) return false;
796
if (name == 0) return false;
798
int Loc = vw_GetUniformLocation(GLSL, name);
799
if (Loc == -1) return false;
801
return vw_Uniform4fv(GLSL, Loc, count, data);
805
bool vw_UniformMatrix4fv(eGLSL *GLSL, int UniformLocation, bool transpose, int count, float *data)
807
if (GLSL == 0) return false;
808
if (glUniformMatrix4fvARB == NULL) return false;
810
glUniformMatrix4fvARB(UniformLocation, count, transpose, data);
812
CheckOGLError(); // Check for OpenGL errors
816
bool vw_UniformMatrix4fv(eGLSL *GLSL, const char *name, bool transpose, int count, float *data)
818
if (GLSL == 0) return false;
819
if (name == 0) return false;
821
int Loc = vw_GetUniformLocation(GLSL, name);
822
if (Loc == -1) return false;
824
return vw_UniformMatrix4fv(GLSL, Loc, transpose, count, data);