"Shader.h" "Renderer.h": #Include #Include #Include #Include #Include
"Shader.h" "Renderer.h": #Include #Include #Include #Include #Include
h"
#include <sstream>
#include <fstream>
#include <iostream>
#include "Renderer.h"
Shader::~Shader() {
GLCall(glDeleteProgram(m_RendererID));
}
std::string line;
std::stringstream ss[2];
ShaderType type = ShaderType::NONE;
while (getline(stream, line)) {
if (line.find("#shader") != std::string::npos) {
if (line.find("vertex") != std::string::npos)
type = ShaderType::VERTEX;
else if (line.find("fragment") != std::string::npos)
type = ShaderType::FRAGMENT;
}
else {
ss[(int)type] << line << '\n';
}
}
m_VertexShader = ss[0].str();
m_FragmentShader = ss[1].str();
return { ss[0].str(), ss[1].str() };
}
void Shader::PrintShaderCode() {
std::cout << m_VertexShader << std::endl;
std::cout << m_FragmentShader << std::endl;
}
int result;
glGetShaderiv(id, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE) {
int length;
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
char* message = (char*)malloc(length * sizeof(char));
glGetShaderInfoLog(id, length, &length, message);
std::cout << "Failed to compile"
<< (type == GL_VERTEX_SHADER ? " vertex " : " fragment ") << "shader" <<
std::endl;
std::cout << message << std::endl;
glDeleteShader(id);
return 0;
}
return id;
}
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
void Shader::SetUniform4f(const std::string& name, float v0, float v1, float v2, float
v3) {
GLCall(glUniform4f(GetUniformLocation(name), v0, v1, v2, v3));
}
m_UniformLocationCache[name] = location;
return location;
}