5 m_FilePath(filepath), m_RendererID(0)
28 std::ifstream stream(filepath);
38 std::stringstream ss[2];
39 ShaderType type = ShaderType::NONE;
42 while (getline(stream, line))
44 if (line.find(
"#shader") != std::string::npos)
46 if (line.find(
"vertex") != std::string::npos)
48 type = ShaderType::VERTEX;
50 else if (line.find(
"fragment") != std::string::npos)
52 type = ShaderType::FRAGMENT;
57 ss[(int)type] << line <<
'\n';
61 return {ss[0].str(), ss[1].str()};
65 std::cout <<
"No Shaders File Found!!!" << std::endl;
66 throw "No Shaders File Found!!!";
72 unsigned int id = glCreateShader(type);
73 const char* src = source.c_str();
74 GLCall(glShaderSource(
id, 1, &src,
nullptr));
75 GLCall(glCompileShader(
id));
78 GLCall(glGetShaderiv(
id, GL_COMPILE_STATUS, &result));
80 if (result == GL_FALSE)
83 GLCall(glGetShaderiv(
id, GL_INFO_LOG_LENGTH, &length));
84 char* message = (
char*)alloca(length *
sizeof(
char));
85 GLCall(glGetShaderInfoLog(
id, length, &length, message));
86 std::cout <<
"Failed to compile " << (type == GL_VERTEX_SHADER ?
"vertex" :
"fragment") <<
" shader" << std::endl;
87 std::cout << message << std::endl;
89 GLCall(glDeleteShader(
id));
98 unsigned int program = glCreateProgram();
99 unsigned int vs =
CompileShader(GL_VERTEX_SHADER, verxterShader);
100 unsigned int fs =
CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
102 GLCall(glAttachShader(program, vs));
103 GLCall(glAttachShader(program, fs));
105 GLCall(glLinkProgram(program));
106 GLCall(glValidateProgram(program));
108 GLCall(glDeleteShader(vs));
109 GLCall(glDeleteShader(fs));
147 std::cout <<
"Warning: uniform '" << name <<
"' doesn't exist!!" << std::endl;
unsigned int CompileShader(unsigned int type, const std::string &source)
unsigned int m_RendererID
void SetUniform2f(const std::string &name, float v0, float v1)
void SetUniformMat4f(const std::string &name, glm::mat4 &matrix)
int GetUniformLocation(const std::string &name)
std::unordered_map< std::string, int > m_UniformLocationCache
Shader(const std::string &filepath)
void SetUniform1i(const std::string &name, int value)
void SetUniform1f(const std::string &name, float value)
unsigned int CreateShader(const std::string &verxterShader, const std::string &fragmentShader)
ShaderProgramSource ParseShader(const std::string &filepath)
void SetUniform4f(const std::string &name, float v0, float v1, float f2, float f3)