-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBaseShader.cpp
executable file
·98 lines (76 loc) · 2.27 KB
/
BaseShader.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
//
// BaseShader.cpp
// ogl4
//
// Created by Philipp Lensing on 19.09.16.
// Copyright © 2016 Philipp Lensing. All rights reserved.
//
#include "BaseShader.h"
const BaseShader* BaseShader::ShaderInPipe = NULL;
BaseShader::BaseShader()
{
ModelTransform.identity();
}
GLuint BaseShader::createShaderProgram( const char* VScode, const char* FScode )
{
ModelTransform.identity();
const unsigned int LogSize = 64*1024;
char ShaderLog[LogSize];
GLsizei WrittenToLog=0;
GLint Success = 0;
GLuint VS = glCreateShader(GL_VERTEX_SHADER);
GLuint FS = glCreateShader(GL_FRAGMENT_SHADER);
GLenum Error = glGetError();
if(Error!=0)
{
std::cout << "Unable to create shader objects. Please ensure that PhongShader is used for the first time AFTER successful creation of an OpenGL context!";
exit(0);
}
glShaderSource(VS, 1, &VScode, NULL);
glShaderSource(FS, 1, &FScode, NULL);
glCompileShader(VS);
glGetShaderiv(VS, GL_COMPILE_STATUS, &Success);
if(Success==GL_FALSE)
glGetShaderInfoLog(VS, LogSize, &WrittenToLog, ShaderLog);
glCompileShader(FS);
glGetShaderiv(FS, GL_COMPILE_STATUS, &Success);
if(Success==GL_FALSE)
{
GLsizei Written=0;
glGetShaderInfoLog(FS, LogSize-WrittenToLog, &Written, &ShaderLog[WrittenToLog]);
WrittenToLog+=Written;
}
if( WrittenToLog > 0 )
{
// compilation failed
std::cout << ShaderLog;
exit(0);
}
ShaderProgram = glCreateProgram();
assert(ShaderProgram);
glAttachShader(ShaderProgram, VS);
glDeleteShader(VS);
glAttachShader(ShaderProgram, FS);
glDeleteShader(FS);
glLinkProgram(ShaderProgram);
glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);
if(Success==GL_FALSE)
glGetShaderInfoLog(ShaderProgram, LogSize-WrittenToLog, NULL, &ShaderLog[WrittenToLog]);
if( WrittenToLog > 0 )
{
// compilation failed
std::cout << ShaderLog;
exit(0);
}
return ShaderProgram;
}
void BaseShader::activate(const BaseCamera& Cam) const
{
if(ShaderInPipe != this)
glUseProgram(ShaderProgram);
ShaderInPipe = this;
}
void BaseShader::deactivate() const
{
glUseProgram(0);
}