2D_Game_Engine
Loading...
Searching...
No Matches
shader.cpp
Go to the documentation of this file.
1#include <pch.hpp>
2#include <shader.hpp>
3
4Shader::Shader(const char *vertex_shader_path,const char *fragment_shader_path){
5 Load(vertex_shader_path,fragment_shader_path);
6}
7
9 Unload();
10 if(m_VertexPath!=nullptr)
11 free(m_VertexPath);
12 if(m_FragmentPath!=nullptr)
13 free(m_FragmentPath);
14}
15
16void Shader::Load(const char *vertex_shader_path,const char *fragment_shader_path){
17 m_Loaded=true;
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();
23
24 std::string vertexCode;
25 std::string fragmentCode;
26 FILE *vertexFile=fopen(vertex_shader_path,"r");
27 FILE *fragmentFile=fopen(fragment_shader_path,"r");
28
29 if(vertexFile==NULL){
30 perror("Couldn't open vertex shader file\n");
31 return;
32 }
33
34 if(fragmentFile==NULL){
35 perror("Couldn't open fragment shader file\n");
36 return;
37 }
38
39 char ch;
40 while((ch=fgetc(vertexFile))!=EOF){
41 vertexCode+=ch;
42 }
43 while((ch=fgetc(fragmentFile))!=EOF){
44 fragmentCode+=ch;
45 }
46
47 fclose(vertexFile);
48 fclose(fragmentFile);
49
50 const char *vertexSourceCode=vertexCode.c_str();
51 const char *fragmentSourceCode=fragmentCode.c_str();
52
53 Compile(vertexSourceCode,fragmentSourceCode);
54}
55
57 if(m_Loaded){
58 glDeleteProgram(m_ID);
59 m_Loaded=false;
60 }
61}
62
64 Unload();
65 Load(m_VertexPath,m_FragmentPath);
66}
67
68void Shader::Bind() const{
69 glUseProgram(m_ID);
70}
71
72void Shader::Unbind() const{
73 glUseProgram(0);
74}
75
76void Shader::Compile(const char *vertex_src_code,const char *fragment_src_code){
77unsigned int vertexShader,fragmentShader;
78
79 //compile vertex Shader
80 vertexShader=glCreateShader(GL_VERTEX_SHADER);
81 glShaderSource(vertexShader,1,&vertex_src_code,NULL);
82 glCompileShader(vertexShader);
83 CheckShaderErrors(vertexShader);
84
85 //compile fragment Shader
86 fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
87 glShaderSource(fragmentShader,1,&fragment_src_code,NULL);
88 glCompileShader(fragmentShader);
89 CheckShaderErrors(fragmentShader);
90
91 glAttachShader(m_ID,vertexShader);
92 glAttachShader(m_ID,fragmentShader);
93 glLinkProgram(m_ID);
94
95 glDeleteShader(vertexShader);
96 glDeleteShader(fragmentShader);
97}
98
99bool Shader::CheckShaderErrors(GLuint ShaderID){
100 int CompileStatus;
101 glGetShaderiv(ShaderID,GL_COMPILE_STATUS,&CompileStatus);
102 if(CompileStatus!=GL_TRUE){
103 int InfoLogLength;
104 glGetShaderiv(ShaderID,GL_INFO_LOG_LENGTH,&InfoLogLength);
105 char *buffer=(char*)AllocateMemory(InfoLogLength*sizeof(char));
106
107 int BufferSize;
108 glGetShaderInfoLog(ShaderID,InfoLogLength,&BufferSize,buffer);
109 puts(buffer);
110 FreeMemory(buffer);
111 return false;
112 }
113 return true;
114}
115
116void Shader::SetUniform4f(const std::string &name,float v0,float v1,float v2,float v3){
117 glUniform4f(GetUniformLocation(name),v0,v1,v2,v3);
118}
119
120void Shader::SetUniform3f(const std::string &name,float v0,float v1,float v2){
121 glUniform3f(GetUniformLocation(name),v0,v1,v2);
122}
123
124void Shader::SetUniform2f(const std::string &name,float v0,float v1){
125 glUniform2f(GetUniformLocation(name),v0,v1);
126}
127
128void Shader::SetUniform1iv(const std::string &name,int *v,unsigned int num_elem){
129 glUniform1iv(GetUniformLocation(name),num_elem,v);
130}
131
132void Shader::SetUniform1f(const std::string &name,float v0){
133 glUniform1f(GetUniformLocation(name),v0);
134}
135
136void Shader::SetUniformMat4fv(const std::string &name,float *proj,unsigned int num_elem){
137 glUniformMatrix4fv(GetUniformLocation(name),num_elem,GL_FALSE,proj);
138}
139
140void Shader::SetUniform1i(const std::string &name,int v0){
141 glUniform1i(GetUniformLocation(name),v0);
142}
143
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;
149 if(location==-1)
150 printf("Warning: Uniform %s doesn't exist\n",name.c_str());
151 return location;
152}
153
154unsigned int Shader::GetSubroutineIndex(const char *uniform_name,unsigned int shader_id){
155 unsigned int temp;
156 if(uniform_name==nullptr){
157 return std::numeric_limits<unsigned int>::max();
158 }
159 temp=glGetSubroutineIndex(shader_id,GL_FRAGMENT_SHADER,uniform_name);
160 return temp;
161}
162
163void Shader::SetSubroutineUniform(unsigned int uniform_index){
164 glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&uniform_index);
165}
void SetUniform4f(const std::string &name, float v0, float v1, float v2, float v3)
Definition shader.cpp:116
static unsigned int GetSubroutineIndex(const char *uniform_name, unsigned int shader_id)
Definition shader.cpp:154
void SetUniform2f(const std::string &name, float v0, float v1)
Definition shader.cpp:124
void Bind() const
Definition shader.cpp:68
void SetUniform1iv(const std::string &name, int *v, unsigned int num_elem)
Definition shader.cpp:128
void Load(const char *vertex_shader_path, const char *fragment_shader_path)
Definition shader.cpp:16
void Reload()
Definition shader.cpp:63
void SetUniform1f(const std::string &name, float v0)
Definition shader.cpp:132
void SetUniform1i(const std::string &name, int v0)
Definition shader.cpp:140
void Unload()
Definition shader.cpp:56
void SetUniformMat4fv(const std::string &name, float *proj, unsigned int num_elem)
Definition shader.cpp:136
static void SetSubroutineUniform(unsigned int uniform_index)
Definition shader.cpp:163
void SetUniform3f(const std::string &name, float v0, float v1, float v2)
Definition shader.cpp:120
void Unbind() const
Definition shader.cpp:72
Shader()=default
~Shader()
Definition shader.cpp:8
void FreeMemory(void *ptr, std::source_location src=std::source_location::current())
Definition memory.cpp:11
void * AllocateMemory(size_t size, std::source_location src=std::source_location::current())
Definition memory.cpp:3
fclose(fkey)
char ch