mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-02 04:37:54 +08:00
LearnOpenGL's header fixes.
This commit is contained in:
@@ -1,14 +1,11 @@
|
|||||||
#pragma once
|
#ifndef CAMERA_H
|
||||||
|
#define CAMERA_H
|
||||||
|
|
||||||
// Std. Includes
|
#include <glad/glad.h>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
// GL Includes
|
|
||||||
#include <GL/glew.h>
|
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
// Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methods
|
// Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methods
|
||||||
enum Camera_Movement {
|
enum Camera_Movement {
|
||||||
@@ -21,8 +18,8 @@ enum Camera_Movement {
|
|||||||
// Default camera values
|
// Default camera values
|
||||||
const GLfloat YAW = -90.0f;
|
const GLfloat YAW = -90.0f;
|
||||||
const GLfloat PITCH = 0.0f;
|
const GLfloat PITCH = 0.0f;
|
||||||
const GLfloat SPEED = 3.0f;
|
const GLfloat SPEED = 2.5f;
|
||||||
const GLfloat SENSITIVTY = 0.25f;
|
const GLfloat SENSITIVTY = 0.1f;
|
||||||
const GLfloat ZOOM = 45.0f;
|
const GLfloat ZOOM = 45.0f;
|
||||||
|
|
||||||
|
|
||||||
@@ -131,3 +128,4 @@ private:
|
|||||||
this->Up = glm::normalize(glm::cross(this->Right, this->Front));
|
this->Up = glm::normalize(glm::cross(this->Right, this->Front));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
#ifndef SHADER_H
|
#ifndef SHADER_H
|
||||||
#define SHADER_H
|
#define SHADER_H
|
||||||
|
|
||||||
#include <GL/glew.h>
|
#include <glad/glad.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
@@ -11,37 +12,38 @@
|
|||||||
class Shader
|
class Shader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GLuint Program;
|
unsigned int ID;
|
||||||
// Constructor generates the shader on the fly
|
// constructor generates the shader on the fly
|
||||||
Shader(const GLchar* vertexPath, const GLchar* fragmentPath, const GLchar* geometryPath = nullptr)
|
// ------------------------------------------------------------------------
|
||||||
|
Shader(const char* vertexPath, const char* fragmentPath, const char* geometryPath = nullptr)
|
||||||
{
|
{
|
||||||
// 1. Retrieve the vertex/fragment source code from filePath
|
// 1. retrieve the vertex/fragment source code from filePath
|
||||||
std::string vertexCode;
|
std::string vertexCode;
|
||||||
std::string fragmentCode;
|
std::string fragmentCode;
|
||||||
std::string geometryCode;
|
std::string geometryCode;
|
||||||
std::ifstream vShaderFile;
|
std::ifstream vShaderFile;
|
||||||
std::ifstream fShaderFile;
|
std::ifstream fShaderFile;
|
||||||
std::ifstream gShaderFile;
|
std::ifstream gShaderFile;
|
||||||
// ensures ifstream objects can throw exceptions:
|
// ensure ifstream objects can throw exceptions:
|
||||||
vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
||||||
fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
||||||
gShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
gShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Open files
|
// open files
|
||||||
vShaderFile.open(vertexPath);
|
vShaderFile.open(vertexPath);
|
||||||
fShaderFile.open(fragmentPath);
|
fShaderFile.open(fragmentPath);
|
||||||
std::stringstream vShaderStream, fShaderStream;
|
std::stringstream vShaderStream, fShaderStream;
|
||||||
// Read file's buffer contents into streams
|
// read file's buffer contents into streams
|
||||||
vShaderStream << vShaderFile.rdbuf();
|
vShaderStream << vShaderFile.rdbuf();
|
||||||
fShaderStream << fShaderFile.rdbuf();
|
fShaderStream << fShaderFile.rdbuf();
|
||||||
// close file handlers
|
// close file handlers
|
||||||
vShaderFile.close();
|
vShaderFile.close();
|
||||||
fShaderFile.close();
|
fShaderFile.close();
|
||||||
// Convert stream into string
|
// convert stream into string
|
||||||
vertexCode = vShaderStream.str();
|
vertexCode = vShaderStream.str();
|
||||||
fragmentCode = fShaderStream.str();
|
fragmentCode = fShaderStream.str();
|
||||||
// If geometry shader path is present, also load a geometry shader
|
// if geometry shader path is present, also load a geometry shader
|
||||||
if(geometryPath != nullptr)
|
if(geometryPath != nullptr)
|
||||||
{
|
{
|
||||||
gShaderFile.open(geometryPath);
|
gShaderFile.open(geometryPath);
|
||||||
@@ -55,51 +57,115 @@ public:
|
|||||||
{
|
{
|
||||||
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
|
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
|
||||||
}
|
}
|
||||||
const GLchar* vShaderCode = vertexCode.c_str();
|
const char* vShaderCode = vertexCode.c_str();
|
||||||
const GLchar * fShaderCode = fragmentCode.c_str();
|
const char * fShaderCode = fragmentCode.c_str();
|
||||||
// 2. Compile shaders
|
// 2. compile shaders
|
||||||
GLuint vertex, fragment;
|
unsigned int vertex, fragment;
|
||||||
GLint success;
|
int success;
|
||||||
GLchar infoLog[512];
|
char infoLog[512];
|
||||||
// Vertex Shader
|
// vertex shader
|
||||||
vertex = glCreateShader(GL_VERTEX_SHADER);
|
vertex = glCreateShader(GL_VERTEX_SHADER);
|
||||||
glShaderSource(vertex, 1, &vShaderCode, NULL);
|
glShaderSource(vertex, 1, &vShaderCode, NULL);
|
||||||
glCompileShader(vertex);
|
glCompileShader(vertex);
|
||||||
checkCompileErrors(vertex, "VERTEX");
|
checkCompileErrors(vertex, "VERTEX");
|
||||||
// Fragment Shader
|
// fragment Shader
|
||||||
fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||||
glCompileShader(fragment);
|
glCompileShader(fragment);
|
||||||
checkCompileErrors(fragment, "FRAGMENT");
|
checkCompileErrors(fragment, "FRAGMENT");
|
||||||
// If geometry shader is given, compile geometry shader
|
// if geometry shader is given, compile geometry shader
|
||||||
GLuint geometry;
|
unsigned int geometry;
|
||||||
if(geometryPath != nullptr)
|
if(geometryPath != nullptr)
|
||||||
{
|
{
|
||||||
const GLchar * gShaderCode = geometryCode.c_str();
|
const char * gShaderCode = geometryCode.c_str();
|
||||||
geometry = glCreateShader(GL_GEOMETRY_SHADER);
|
geometry = glCreateShader(GL_GEOMETRY_SHADER);
|
||||||
glShaderSource(geometry, 1, &gShaderCode, NULL);
|
glShaderSource(geometry, 1, &gShaderCode, NULL);
|
||||||
glCompileShader(geometry);
|
glCompileShader(geometry);
|
||||||
checkCompileErrors(geometry, "GEOMETRY");
|
checkCompileErrors(geometry, "GEOMETRY");
|
||||||
}
|
}
|
||||||
// Shader Program
|
// shader Program
|
||||||
this->Program = glCreateProgram();
|
ID = glCreateProgram();
|
||||||
glAttachShader(this->Program, vertex);
|
glAttachShader(ID, vertex);
|
||||||
glAttachShader(this->Program, fragment);
|
glAttachShader(ID, fragment);
|
||||||
if(geometryPath != nullptr)
|
if(geometryPath != nullptr)
|
||||||
glAttachShader(this->Program, geometry);
|
glAttachShader(ID, geometry);
|
||||||
glLinkProgram(this->Program);
|
glLinkProgram(ID);
|
||||||
checkCompileErrors(this->Program, "PROGRAM");
|
checkCompileErrors(ID, "PROGRAM");
|
||||||
// Delete the shaders as they're linked into our program now and no longer necessery
|
// delete the shaders as they're linked into our program now and no longer necessery
|
||||||
glDeleteShader(vertex);
|
glDeleteShader(vertex);
|
||||||
glDeleteShader(fragment);
|
glDeleteShader(fragment);
|
||||||
if(geometryPath != nullptr)
|
if(geometryPath != nullptr)
|
||||||
glDeleteShader(geometry);
|
glDeleteShader(geometry);
|
||||||
|
|
||||||
}
|
}
|
||||||
// Uses the current shader
|
// activate the shader
|
||||||
void Use() { glUseProgram(this->Program); }
|
// ------------------------------------------------------------------------
|
||||||
|
void use()
|
||||||
|
{
|
||||||
|
glUseProgram(ID);
|
||||||
|
}
|
||||||
|
// utility uniform functions
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setBool(std::string name, bool value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setInt(std::string name, int value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setFloat(std::string name, float value)
|
||||||
|
{
|
||||||
|
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec2(std::string name, const glm::vec2 &value)
|
||||||
|
{
|
||||||
|
glUniform2fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec2(std::string name, float x, float y)
|
||||||
|
{
|
||||||
|
glUniform2f(glGetUniformLocation(ID, name.c_str()), x, y);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec3(std::string name, const glm::vec3 &value)
|
||||||
|
{
|
||||||
|
glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec3(std::string name, float x, float y, float z)
|
||||||
|
{
|
||||||
|
glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec4(std::string name, const glm::vec4 &value)
|
||||||
|
{
|
||||||
|
glUniform4fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec4(std::string name, float x, float y, float z, float w)
|
||||||
|
{
|
||||||
|
glUniform4f(glGetUniformLocation(ID, name.c_str()), x, y, z, w);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat2(std::string name, const glm::mat2 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix2fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat3(std::string name, const glm::mat3 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix3fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat4(std::string name, const glm::mat4 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// utility function for checking shader compilation/linking errors.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
void checkCompileErrors(GLuint shader, std::string type)
|
void checkCompileErrors(GLuint shader, std::string type)
|
||||||
{
|
{
|
||||||
GLint success;
|
GLint success;
|
||||||
@@ -110,7 +176,7 @@ private:
|
|||||||
if(!success)
|
if(!success)
|
||||||
{
|
{
|
||||||
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||||
std::cout << "| ERROR::::SHADER-COMPILATION-ERROR of type: " << type << "|\n" << infoLog << "\n| -- --------------------------------------------------- -- |" << std::endl;
|
std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -119,7 +185,7 @@ private:
|
|||||||
if(!success)
|
if(!success)
|
||||||
{
|
{
|
||||||
glGetProgramInfoLog(shader, 1024, NULL, infoLog);
|
glGetProgramInfoLog(shader, 1024, NULL, infoLog);
|
||||||
std::cout << "| ERROR::::PROGRAM-LINKING-ERROR of type: " << type << "|\n" << infoLog << "\n| -- --------------------------------------------------- -- |" << std::endl;
|
std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
168
includes/learnopengl/shader_m.h
Normal file
168
includes/learnopengl/shader_m.h
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
#ifndef SHADER_H
|
||||||
|
#define SHADER_H
|
||||||
|
|
||||||
|
#include <glad/glad.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class Shader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
unsigned int ID;
|
||||||
|
// constructor generates the shader on the fly
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
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, NULL);
|
||||||
|
glCompileShader(vertex);
|
||||||
|
checkCompileErrors(vertex, "VERTEX");
|
||||||
|
// fragment Shader
|
||||||
|
fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||||
|
glCompileShader(fragment);
|
||||||
|
checkCompileErrors(fragment, "FRAGMENT");
|
||||||
|
// shader Program
|
||||||
|
ID = glCreateProgram();
|
||||||
|
glAttachShader(ID, vertex);
|
||||||
|
glAttachShader(ID, fragment);
|
||||||
|
glLinkProgram(ID);
|
||||||
|
checkCompileErrors(ID, "PROGRAM");
|
||||||
|
// delete the shaders as they're linked into our program now and no longer necessery
|
||||||
|
glDeleteShader(vertex);
|
||||||
|
glDeleteShader(fragment);
|
||||||
|
|
||||||
|
}
|
||||||
|
// activate the shader
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void use()
|
||||||
|
{
|
||||||
|
glUseProgram(ID);
|
||||||
|
}
|
||||||
|
// utility uniform functions
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setBool(std::string name, bool value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setInt(std::string name, int value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setFloat(std::string name, float value)
|
||||||
|
{
|
||||||
|
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec2(std::string name, const glm::vec2 &value)
|
||||||
|
{
|
||||||
|
glUniform2fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec2(std::string name, float x, float y)
|
||||||
|
{
|
||||||
|
glUniform2f(glGetUniformLocation(ID, name.c_str()), x, y);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec3(std::string name, const glm::vec3 &value)
|
||||||
|
{
|
||||||
|
glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec3(std::string name, float x, float y, float z)
|
||||||
|
{
|
||||||
|
glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setVec4(std::string name, const glm::vec4 &value)
|
||||||
|
{
|
||||||
|
glUniform4fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||||
|
}
|
||||||
|
void setVec4(std::string name, float x, float y, float z, float w)
|
||||||
|
{
|
||||||
|
glUniform4f(glGetUniformLocation(ID, name.c_str()), x, y, z, w);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat2(std::string name, const glm::mat2 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix2fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat3(std::string name, const glm::mat3 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix3fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setMat4(std::string name, const glm::mat4 &mat)
|
||||||
|
{
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// utility function for checking shader compilation/linking errors.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void checkCompileErrors(GLuint shader, std::string type)
|
||||||
|
{
|
||||||
|
GLint success;
|
||||||
|
GLchar infoLog[1024];
|
||||||
|
if(type != "PROGRAM")
|
||||||
|
{
|
||||||
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glGetProgramiv(shader, GL_LINK_STATUS, &success);
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
glGetProgramInfoLog(shader, 1024, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
124
includes/learnopengl/shader_s.h
Normal file
124
includes/learnopengl/shader_s.h
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
#ifndef SHADER_H
|
||||||
|
#define SHADER_H
|
||||||
|
|
||||||
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class Shader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
unsigned int ID;
|
||||||
|
// constructor generates the shader on the fly
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
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, NULL);
|
||||||
|
glCompileShader(vertex);
|
||||||
|
checkCompileErrors(vertex, "VERTEX");
|
||||||
|
// fragment Shader
|
||||||
|
fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||||
|
glCompileShader(fragment);
|
||||||
|
checkCompileErrors(fragment, "FRAGMENT");
|
||||||
|
// shader Program
|
||||||
|
ID = glCreateProgram();
|
||||||
|
glAttachShader(ID, vertex);
|
||||||
|
glAttachShader(ID, fragment);
|
||||||
|
glLinkProgram(ID);
|
||||||
|
checkCompileErrors(ID, "PROGRAM");
|
||||||
|
// delete the shaders as they're linked into our program now and no longer necessery
|
||||||
|
glDeleteShader(vertex);
|
||||||
|
glDeleteShader(fragment);
|
||||||
|
}
|
||||||
|
// activate the shader
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void use()
|
||||||
|
{
|
||||||
|
glUseProgram(ID);
|
||||||
|
}
|
||||||
|
// utility uniform functions
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setBool(std::string name, bool value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setInt(std::string name, int value)
|
||||||
|
{
|
||||||
|
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setFloat(std::string name, float value)
|
||||||
|
{
|
||||||
|
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// utility function for checking shader compilation/linking errors.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void checkCompileErrors(GLuint shader, std::string type)
|
||||||
|
{
|
||||||
|
GLint success;
|
||||||
|
GLchar infoLog[1024];
|
||||||
|
if(type != "PROGRAM")
|
||||||
|
{
|
||||||
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glGetProgramiv(shader, GL_LINK_STATUS, &success);
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
glGetProgramInfoLog(shader, 1024, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user