KerelOlivier
2 years ago
6 changed files with 192 additions and 1 deletions
@ -0,0 +1,92 @@
@@ -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 @@
@@ -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 @@
@@ -0,0 +1,8 @@
|
||||
#version 330 core |
||||
out vec4 FragColor; |
||||
in vec3 ourColor; |
||||
|
||||
void main() |
||||
{ |
||||
FragColor = vec4(ourColor, 1.0); |
||||
} |
@ -0,0 +1,11 @@
@@ -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