4Shader::Shader(
const char *vertex_shader_path,
const char *fragment_shader_path){
5 Load(vertex_shader_path,fragment_shader_path);
10 if(m_VertexPath!=
nullptr)
12 if(m_FragmentPath!=
nullptr)
16void Shader::Load(
const char *vertex_shader_path,
const char *fragment_shader_path){
18 m_VertexPath=strdup(vertex_shader_path);
19 m_FragmentPath=strdup(fragment_shader_path);
20 printf(
"Loading shader %s %s\n",vertex_shader_path,fragment_shader_path);
21 printf(
"Loaded shader %s %s\n",m_VertexPath,m_FragmentPath);
22 m_ID=glCreateProgram();
24 std::string vertexCode;
25 std::string fragmentCode;
26 FILE *vertexFile=fopen(vertex_shader_path,
"r");
27 FILE *fragmentFile=fopen(fragment_shader_path,
"r");
30 perror(
"Couldn't open vertex shader file\n");
34 if(fragmentFile==NULL){
35 perror(
"Couldn't open fragment shader file\n");
40 while((
ch=fgetc(vertexFile))!=EOF){
43 while((
ch=fgetc(fragmentFile))!=EOF){
50 const char *vertexSourceCode=vertexCode.c_str();
51 const char *fragmentSourceCode=fragmentCode.c_str();
53 Compile(vertexSourceCode,fragmentSourceCode);
58 glDeleteProgram(m_ID);
65 Load(m_VertexPath,m_FragmentPath);
76void Shader::Compile(
const char *vertex_src_code,
const char *fragment_src_code){
77unsigned int vertexShader,fragmentShader;
80 vertexShader=glCreateShader(GL_VERTEX_SHADER);
81 glShaderSource(vertexShader,1,&vertex_src_code,NULL);
82 glCompileShader(vertexShader);
83 CheckShaderErrors(vertexShader);
86 fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
87 glShaderSource(fragmentShader,1,&fragment_src_code,NULL);
88 glCompileShader(fragmentShader);
89 CheckShaderErrors(fragmentShader);
91 glAttachShader(m_ID,vertexShader);
92 glAttachShader(m_ID,fragmentShader);
95 glDeleteShader(vertexShader);
96 glDeleteShader(fragmentShader);
99bool Shader::CheckShaderErrors(GLuint ShaderID){
101 glGetShaderiv(ShaderID,GL_COMPILE_STATUS,&CompileStatus);
102 if(CompileStatus!=GL_TRUE){
104 glGetShaderiv(ShaderID,GL_INFO_LOG_LENGTH,&InfoLogLength);
108 glGetShaderInfoLog(ShaderID,InfoLogLength,&BufferSize,buffer);
117 glUniform4f(GetUniformLocation(name),v0,v1,v2,v3);
121 glUniform3f(GetUniformLocation(name),v0,v1,v2);
125 glUniform2f(GetUniformLocation(name),v0,v1);
129 glUniform1iv(GetUniformLocation(name),num_elem,v);
133 glUniform1f(GetUniformLocation(name),v0);
137 glUniformMatrix4fv(GetUniformLocation(name),num_elem,GL_FALSE,proj);
141 glUniform1i(GetUniformLocation(name),v0);
144int Shader::GetUniformLocation(
const std::string &name){
145 if(m_UniformsCache.find(name)!=m_UniformsCache.end())
146 return m_UniformsCache[name];
147 int location=glGetUniformLocation(m_ID,name.c_str());
148 m_UniformsCache[name]=location;
150 printf(
"Warning: Uniform %s doesn't exist\n",name.c_str());
156 if(uniform_name==
nullptr){
157 return std::numeric_limits<unsigned int>::max();
159 temp=glGetSubroutineIndex(shader_id,GL_FRAGMENT_SHADER,uniform_name);
164 glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&uniform_index);
void SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3)
static unsigned int GetSubroutineIndex(const char *uniform_name, unsigned int shader_id)
void SetUniform2f(const std::string &name, float v0, float v1)
void SetUniform1iv(const std::string &name, int *v, unsigned int num_elem)
void Load(const char *vertex_shader_path, const char *fragment_shader_path)
void SetUniform1f(const std::string &name, float v0)
void SetUniform1i(const std::string &name, int v0)
void SetUniformMat4fv(const std::string &name, float *proj, unsigned int num_elem)
static void SetSubroutineUniform(unsigned int uniform_index)
void SetUniform3f(const std::string &name, float v0, float v1, float v2)
void FreeMemory(void *ptr, std::source_location src=std::source_location::current())
void * AllocateMemory(size_t size, std::source_location src=std::source_location::current())