17 #include "ShaderProgram.h" 19 #include "VertexShader.h" 21 #define MAX_LOG_SIZE 1024 23 ShaderProgram::ShaderProgram() {
28 this->vertexShader = vertexShader;
29 this->fragmentShader = fragmentShader;
30 createProgram(vertexShader->getGLId(), fragmentShader->getGLId());
34 void ShaderProgram::createProgram(GLuint vertexShader, GLuint fragmentShader) {
35 this->shaderID = glCreateProgram();
36 glAttachShader(this->shaderID, vertexShader);
37 glAttachShader(this->shaderID, fragmentShader);
41 void ShaderProgram::linkProgram() {
42 glLinkProgram(this->shaderID);
46 void ShaderProgram::checkLinkageErrors() {
47 GLint successfullyLinked;
48 glGetProgramiv(this->shaderID, GL_LINK_STATUS, &successfullyLinked);
49 if(!successfullyLinked) {
54 void ShaderProgram::logLinkageError() {
55 GLchar linkageLog[MAX_LOG_SIZE];
57 glGetShaderInfoLog(this->shaderID, MAX_LOG_SIZE, NULL, linkageLog);
58 Logger::logError(
"Failed to compile shader of type PROGRAM\n" 59 + std::to_string(*linkageLog));
63 glUseProgram(this->shaderID);
67 glGetIntegerv(GL_CURRENT_PROGRAM, &previousShaderProgram);
71 glUseProgram(previousShaderProgram);
74 GLint ShaderProgram::getUniformLocation(
const std::string name) {
75 std::map<std::string, GLint>::iterator it = uniformLocations.find(name);
76 if(it != uniformLocations.end()) {
79 GLint location = glGetUniformLocation(shaderID, name.c_str());
80 uniformLocations.insert(std::pair<std::string,GLint>(name, location));
85 void ShaderProgram::setUniform1i(std::string name,
int value) {
86 glUniform1i(getUniformLocation(name), value);
89 void ShaderProgram::setUniform1f(std::string name,
float value) {
90 glUniform1f(getUniformLocation(name), value);
93 void ShaderProgram::setUniform3f(std::string name, chag::float3 value){
94 glUniform3fv(getUniformLocation(name),1, &value.x);
97 void ShaderProgram::setUniform4f(std::string name, chag::float4 value) {
98 glUniform4fv(getUniformLocation(name),1,&value.x);
101 void ShaderProgram::setUniformMatrix4fv(std::string name, chag::float4x4 matrix) {
102 glUniformMatrix4fv(getUniformLocation(name), 1,
false, &matrix.c1.x);
105 void ShaderProgram::setUniform2f(std::string name, chag::float2 value) {
106 glUniform2fv(getUniformLocation(name),1,&value.x);
109 void ShaderProgram::setUniformBufferObjectBinding(std::string bufferName,
int index) {
110 GLuint matricesUniform = glGetUniformBlockIndex(shaderID, bufferName.c_str());
111 glUniformBlockBinding(shaderID, matricesUniform, index);
114 void ShaderProgram::initUniformBufferObject(std::string bufferName,
int size,
int index) {
115 GLuint uniformBufferObject;
116 glGenBuffers(1, &uniformBufferObject);
117 glBindBuffer(GL_UNIFORM_BUFFER, uniformBufferObject);
118 glBufferData(GL_UNIFORM_BUFFER, size, NULL, GL_STATIC_DRAW);
119 glBindBuffer(GL_UNIFORM_BUFFER, 0);
121 glBindBufferRange(GL_UNIFORM_BUFFER, index, uniformBufferObject, 0, size);
122 glBindBuffer(GL_UNIFORM_BUFFER, 0);
124 uniformLocations.insert(std::pair<std::string, GLint>(bufferName, uniformBufferObject));
127 void ShaderProgram::setUniformBufferSubData(std::string bufferName,
int offset,
int size,
const GLvoid *data) {
128 glBindBuffer(GL_UNIFORM_BUFFER, getUniformLocation(bufferName));
130 glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data);
131 glBindBuffer(GL_UNIFORM_BUFFER, 0);
134 const char *textFileRead(
const char *fn,
bool fatalError) {
137 char *content = NULL;
141 fp = fopen(fn,
"rt");
143 fseek(fp, 0, SEEK_END);
145 fseek(fp, 0, SEEK_SET);
148 content =
new char[count+1];
149 count = fread( content,
sizeof(
char), count, fp);
150 content[count] =
'\0';
154 sprintf(buffer,
"File '%s' is empty\n", fn);
163 sprintf(buffer,
"Unable to read file '%s'\n", fn);
169 fatal_error(
"textFileRead - argument NULL\n");
void restorePreviousShaderProgram()
void loadShader(IShader *vertexShader, IShader *fragmentShader)
void backupCurrentShaderProgram()