Compare commits

...

2 Commits

Author SHA1 Message Date
k
c085fdbf5a Shader Class 2024-12-19 20:20:52 -05:00
k
15cc550bf9 RGB Pulse triangle 2024-12-19 18:10:33 -05:00
6 changed files with 153 additions and 62 deletions

22
headers/shader.hpp Normal file
View File

@ -0,0 +1,22 @@
#ifndef SHADER_H
#define SHADER_H
#include <glad/glad.h>
#include <string>
class Shader {
public:
Shader(const char *vertexPath, const char *fragmentPath);
~Shader();
void use();
void setInt(const std::string &name, int value);
void setFloat(const std::string &name, float value);
private:
unsigned int ID;
unsigned int shaderCMPL(GLenum type, const char *src);
void shaderERR(unsigned int shader);
unsigned int shaderProgramCMPL(const char *vertexSource,
const char *fragmentSource);
void shaderProgramERR(unsigned int shaderProgram);
};
#endif

View File

@ -54,3 +54,12 @@ const char *rgbFragmentShaderSource = "#version 330 core\n"
"{\n" "{\n"
" FragColor = vec4(color, 1.0);\n" " FragColor = vec4(color, 1.0);\n"
"}\0"; "}\0";
const char *rgbPulseFragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"in vec3 color;\n"
"uniform float u_time;"
"void main()\n"
"{\n"
" FragColor = vec4(color,0.0)*(sin(u_time)/2.0+0.5);\n"
"}\0";

View File

@ -0,0 +1,8 @@
#version 330 core
out vec4 FragColor;
in vec3 color;
uniform float u_time;
void main()
{
FragColor = vec4(color,0.0)*(sin(u_time)/2.0+0.5);
}

View File

@ -0,0 +1,9 @@
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 color;
void main()
{
color = aColor;
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

View File

@ -3,16 +3,13 @@
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include <shapes.h> #include <shapes.h>
#include <shader.hpp>
#define UNUSED(x) (void)(x) #define UNUSED(x) (void)(x)
void processInput(GLFWwindow *window); void processInput(GLFWwindow *window);
void framebuffer_size_callback(GLFWwindow *window, int width, int height); void framebuffer_size_callback(GLFWwindow *window, int width, int height);
unsigned int shaderCMPL(GLenum type, const char *src);
void shaderERR(unsigned int shader);
unsigned int shaderProgramCMPL(const char *vertexSource,
const char *fragmentSource);
void shaderProgramERR(unsigned int shaderProgram);
int main(void) { int main(void) {
int tmp = 0; int tmp = 0;
@ -52,9 +49,7 @@ int main(void) {
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(sqr_indices), sqr_indices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(sqr_indices), sqr_indices, GL_STATIC_DRAW);
*/ */
unsigned int shaderProgram = Shader* shaderProgram = new Shader("./shaders/rgbPulseVert.glsl","./shaders/rgbPulseFrag.glsl");
shaderProgramCMPL(rgbVertexShaderSource, rgbFragmentShaderSource);
glUseProgram(shaderProgram);
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
processInput(window); processInput(window);
@ -62,7 +57,8 @@ int main(void) {
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram); shaderProgram->use();
shaderProgram->setFloat("u_time",glfwGetTime());
glBindVertexArray(VAO); glBindVertexArray(VAO);
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
@ -72,6 +68,7 @@ int main(void) {
glfwPollEvents(); glfwPollEvents();
} }
delete(shaderProgram);
glfwTerminate(); glfwTerminate();
return 0; return 0;
} }
@ -85,56 +82,3 @@ void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
UNUSED(window); UNUSED(window);
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
} }
unsigned int shaderCMPL(GLenum type, const char *src) {
unsigned int shader;
shader = glCreateShader(type);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
return shader;
}
void shaderERR(unsigned int shader) {
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
}
}
unsigned int shaderProgramCMPL(const char *vertexSource,
const char *fragmentSource) {
unsigned int vertexShader;
vertexShader = shaderCMPL(GL_VERTEX_SHADER, vertexSource);
shaderERR(vertexShader);
unsigned int fragmentShader;
fragmentShader = shaderCMPL(GL_FRAGMENT_SHADER, fragmentSource);
shaderERR(fragmentShader);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
shaderProgramERR(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return shaderProgram;
}
void shaderProgramERR(unsigned int shaderProgram) {
int success;
char infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::FAILED\n" << infoLog << std::endl;
}
}

99
src/shader.cpp Normal file
View File

@ -0,0 +1,99 @@
#include <fstream>
#include <glad/glad.h>
#include <iostream>
#include <shader.hpp>
#include <sstream>
#include <string>
/*pub*/
Shader::Shader(const char *vertexPath, const char *fragmentPath) {
std::string vertexCode, fragmentCode;
std::ifstream vShaderFile, fShaderFile;
vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try {
vShaderFile.open(vertexPath);
fShaderFile.open(fragmentPath);
std::stringstream vShaderStream, fShaderStream;
vShaderStream << vShaderFile.rdbuf();
fShaderStream << fShaderFile.rdbuf();
vShaderFile.close();
fShaderFile.close();
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
} catch (std::ifstream::failure &e) {
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ: " << e.what()
<< std::endl;
}
this->ID = shaderProgramCMPL(vertexCode.c_str(), fragmentCode.c_str());
}
Shader::~Shader() { glDeleteProgram(ID); }
void Shader::use() { glUseProgram(ID); }
void Shader::setInt(const std::string &name, int value) {
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
}
void Shader::setFloat(const std::string &name, float value) {
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
}
/*priv*/
unsigned int Shader::shaderCMPL(GLenum type, const char *src) {
unsigned int shader;
shader = glCreateShader(type);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
return shader;
}
void Shader::shaderERR(unsigned int shader) {
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
}
}
unsigned int Shader::shaderProgramCMPL(const char *vertexSource,
const char *fragmentSource) {
unsigned int vertexShader;
vertexShader = shaderCMPL(GL_VERTEX_SHADER, vertexSource);
shaderERR(vertexShader);
unsigned int fragmentShader;
fragmentShader = shaderCMPL(GL_FRAGMENT_SHADER, fragmentSource);
shaderERR(fragmentShader);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
shaderProgramERR(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return shaderProgram;
}
void Shader::shaderProgramERR(unsigned int shaderProgram) {
int success;
char infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::FAILED\n" << infoLog << std::endl;
}
}