KerelOlivier
2 years ago
6 changed files with 192 additions and 1 deletions
@ -0,0 +1,92 @@ |
|||||||
|
//
|
||||||
|
// Created by olivier on 5/3/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Shader.h" |
||||||
|
|
||||||
|
Shader::Shader(const char* vertexPath, const char* fragmentPath){ |
||||||
|
// 1. retrieve the vertex/fragment source code from filePath
|
||||||
|
std::string vertexCode; |
||||||
|
std::string fragmentCode; |
||||||
|
std::ifstream vShaderFile; |
||||||
|
std::ifstream fShaderFile; |
||||||
|
// ensure ifstream objects can throw exceptions:
|
||||||
|
vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); |
||||||
|
fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); |
||||||
|
try{ |
||||||
|
// open files
|
||||||
|
vShaderFile.open(vertexPath); |
||||||
|
fShaderFile.open(fragmentPath); |
||||||
|
std::stringstream vShaderStream, fShaderStream; |
||||||
|
// read file's buffer contents into streams
|
||||||
|
vShaderStream << vShaderFile.rdbuf(); |
||||||
|
fShaderStream << fShaderFile.rdbuf(); |
||||||
|
// close file handlers
|
||||||
|
vShaderFile.close(); |
||||||
|
fShaderFile.close(); |
||||||
|
// convert stream into string
|
||||||
|
vertexCode = vShaderStream.str(); |
||||||
|
fragmentCode = fShaderStream.str(); |
||||||
|
} |
||||||
|
catch (std::ifstream::failure &e){ |
||||||
|
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; |
||||||
|
} |
||||||
|
const char* vShaderCode = vertexCode.c_str(); |
||||||
|
const char* fShaderCode = fragmentCode.c_str(); |
||||||
|
// 2. compile shaders
|
||||||
|
unsigned int vertex, fragment; |
||||||
|
int success; |
||||||
|
char infoLog[512]; |
||||||
|
// vertex shader
|
||||||
|
vertex = glCreateShader(GL_VERTEX_SHADER); |
||||||
|
glShaderSource(vertex, 1, &vShaderCode, nullptr); |
||||||
|
glCompileShader(vertex); |
||||||
|
// check for shader compile errors
|
||||||
|
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); |
||||||
|
if (!success){ |
||||||
|
glGetShaderInfoLog(vertex, 512, nullptr, infoLog); |
||||||
|
std::cout << vShaderCode << std::endl; |
||||||
|
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; |
||||||
|
} |
||||||
|
// fragment shader
|
||||||
|
fragment = glCreateShader(GL_FRAGMENT_SHADER); |
||||||
|
glShaderSource(fragment, 1, &fShaderCode, nullptr); |
||||||
|
glCompileShader(fragment); |
||||||
|
// check for shader compile errors
|
||||||
|
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); |
||||||
|
if (!success){ |
||||||
|
glGetShaderInfoLog(fragment, 512, nullptr, infoLog); |
||||||
|
std::cout << fShaderCode << std::endl; |
||||||
|
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; |
||||||
|
} |
||||||
|
// shader program
|
||||||
|
ID = glCreateProgram(); |
||||||
|
glAttachShader(ID, vertex); |
||||||
|
glAttachShader(ID, fragment); |
||||||
|
glLinkProgram(ID); |
||||||
|
// check for linking errors
|
||||||
|
if (!success){ |
||||||
|
glGetProgramiv(ID, GL_LINK_STATUS, &success); |
||||||
|
if (!success){ |
||||||
|
glGetProgramInfoLog(ID, 512, nullptr, infoLog); |
||||||
|
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
// delete the shaders as they're linked into our program now and no longer necessery
|
||||||
|
glDeleteShader(vertex); |
||||||
|
glDeleteShader(fragment); |
||||||
|
} |
||||||
|
|
||||||
|
void Shader::use(){ |
||||||
|
glUseProgram(ID); |
||||||
|
} |
||||||
|
|
||||||
|
void Shader::setBool(const std::string &name, bool value) const { |
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value); |
||||||
|
} |
||||||
|
void Shader::setInt(const std::string &name, int value) const { |
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), value); |
||||||
|
} |
||||||
|
void Shader::setFloat(const std::string &name, float value) const { |
||||||
|
glUniform1f(glGetUniformLocation(ID, name.c_str()), value); |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
//
|
||||||
|
// Created by olivier on 5/3/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENGL_TEMPLATE_SHADER_H |
||||||
|
#define OPENGL_TEMPLATE_SHADER_H |
||||||
|
|
||||||
|
|
||||||
|
#include <string> |
||||||
|
#include <fstream> |
||||||
|
#include <sstream> |
||||||
|
#include <iostream> |
||||||
|
#include "glad/glad.h" |
||||||
|
|
||||||
|
class Shader { |
||||||
|
public: |
||||||
|
unsigned int ID; |
||||||
|
|
||||||
|
Shader(const char* vertexPath, const char* fragmentPath); |
||||||
|
// activate the shader
|
||||||
|
void use(); |
||||||
|
// utility uniform functions
|
||||||
|
void setBool(const std::string &name, bool value) const; |
||||||
|
void setInt(const std::string &name, int value) const; |
||||||
|
void setFloat(const std::string &name, float value) const; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
#endif //OPENGL_TEMPLATE_SHADER_H
|
@ -0,0 +1,8 @@ |
|||||||
|
#version 330 core |
||||||
|
out vec4 FragColor; |
||||||
|
in vec3 ourColor; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
FragColor = vec4(ourColor, 1.0); |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
#version 330 core |
||||||
|
layout (location = 0) in vec3 aPos; // the position variable has attribute position 0 |
||||||
|
layout (location = 1) in vec3 aColor; // the color variable has attribute position 1 |
||||||
|
|
||||||
|
out vec3 ourColor; // output a color to the fragment shader |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
gl_Position = vec4(aPos, 1.0); |
||||||
|
ourColor = aColor; // set ourColor to the input color we got from the vertex data |
||||||
|
} |
Loading…
Reference in new issue