Add shaders and file handlers
This commit is contained in:
parent
b37a540bc7
commit
52f77d2b94
15
shaders/basic.frag
Normal file
15
shaders/basic.frag
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#version 460 core
|
||||||
|
|
||||||
|
layout (location = 0) in vec3 normal;
|
||||||
|
layout (location = 1) in vec2 texture_coord;
|
||||||
|
|
||||||
|
out vec4 frag_color;
|
||||||
|
|
||||||
|
uniform sampler2D tex;
|
||||||
|
vec3 light_pos = vec3(4.0, 5.0, -3.0);
|
||||||
|
vec3 light_color = vec3(0.5, 0.5, 0.5);
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
float light_angle = max(dot(normalize(normal), normalize(light_pos)), 0.0);
|
||||||
|
frag_color = texture(tex, tex_coord) * vec4((0.3 + 0.7 * light_angle) * light_color, 1.0);
|
||||||
|
}
|
||||||
20
shaders/basic.vert
Normal file
20
shaders/basic.vert
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#version 460 core
|
||||||
|
|
||||||
|
layout (location = 0) in vec3 in_position;
|
||||||
|
layout (location = 1) in vec3 in_normal;
|
||||||
|
layout (location = 2) in vec2 in_texture_coord;
|
||||||
|
|
||||||
|
layout (location = 0) out vec3 normal;
|
||||||
|
layout (location = 1) out vec2 texture_coord;
|
||||||
|
|
||||||
|
layout (std140, binding = 0) uniform Matrices {
|
||||||
|
mat4 view;
|
||||||
|
mat4 projection;
|
||||||
|
};
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = projection * view * vec4(a_pos, 1.0);
|
||||||
|
normal = in_normal;
|
||||||
|
texture_coord = in_texture_coord;
|
||||||
|
}
|
||||||
|
|
||||||
28
src/file.cpp
Normal file
28
src/file.cpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#include "file.h"
|
||||||
|
|
||||||
|
string load_file_to_string(string filepath) {
|
||||||
|
std::ifstream in_file(filepath);
|
||||||
|
string str;
|
||||||
|
|
||||||
|
if (in_file.is_open()) {
|
||||||
|
in_file.seekg(0, std::ios::end);
|
||||||
|
str.reserve(in_file.tellg());
|
||||||
|
in_file.seekg(0, std::ios::beg);
|
||||||
|
|
||||||
|
str.assign((std::istreambuf_iterator<char>(in_file)),
|
||||||
|
std::istreambuf_iterator<char>());
|
||||||
|
in_file.close();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_file.bad() || in_file.fail()) {
|
||||||
|
in_file.close();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
in_file.close();
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
5
src/file.h
Normal file
5
src/file.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "basic.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
string load_file_to_string(string filepath);
|
||||||
12
src/logger.h
Normal file
12
src/logger.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "basic.h"
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
template <typename... Args>
|
||||||
|
void log(u32 log_level, Args ... args) {
|
||||||
|
if (log_level <= 9) {
|
||||||
|
std::printf(args ...);
|
||||||
|
std::fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -15,3 +15,4 @@ int main () {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
|
||||||
|
|
||||||
bool init_renderer(Renderer* renderer) {
|
bool init_renderer(Renderer* renderer) {
|
||||||
// Creating the window and setting it as the current context
|
// Creating the window and setting it as the current context
|
||||||
glfwInit();
|
glfwInit();
|
||||||
@ -49,6 +50,17 @@ void update_renderer(Renderer* renderer) {
|
|||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void draw_frame(Renderer* renderer) {
|
||||||
|
// Faux mesh
|
||||||
|
f32 vertices[] = {
|
||||||
|
-0.5f, -0.5f, 0.0f,
|
||||||
|
0.5f, -0.5f, 0.0f,
|
||||||
|
0.0f, 0.5f, 0.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
u32 vbo;
|
||||||
|
}
|
||||||
|
|
||||||
void framebuffer_size_callback(GLFWwindow* window, s32 width, s32 height) {
|
void framebuffer_size_callback(GLFWwindow* window, s32 width, s32 height) {
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
|
||||||
struct Renderer {
|
struct Renderer {
|
||||||
GLFWwindow* window = nullptr;
|
GLFWwindow* window = nullptr;
|
||||||
u32 window_width = 800;
|
u32 window_width = 800;
|
||||||
@ -10,5 +11,6 @@ struct Renderer {
|
|||||||
|
|
||||||
bool init_renderer(Renderer* renderer);
|
bool init_renderer(Renderer* renderer);
|
||||||
void cleanup_renderer(Renderer* renderer);
|
void cleanup_renderer(Renderer* renderer);
|
||||||
|
void draw_frame(Renderer* renderer);
|
||||||
void update_renderer(Renderer* renderer);
|
void update_renderer(Renderer* renderer);
|
||||||
void framebuffer_size_callback(GLFWwindow* window, s32 width, s32 height);
|
void framebuffer_size_callback(GLFWwindow* window, s32 width, s32 height);
|
||||||
|
|||||||
64
src/shaders.cpp
Normal file
64
src/shaders.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#include "shaders.h"
|
||||||
|
#include "file.h"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool load_shaders(Shader *shader, string vertex_shader_filepath, string fragment_shader_filepath) {
|
||||||
|
u32 vertex_shader = load_shader(vertex_shader_filepath, VERTEX_SHADER);
|
||||||
|
if (!vertex_shader) {
|
||||||
|
log(1, "%s: could not load vertex shader\n", __FUNCTION__);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 fragment_shader = load_shader(fragment_shader_filepath, FRAGMENT_SHADER);
|
||||||
|
if (!fragment_shader) {
|
||||||
|
log(1, "%s: could not load fragment shader\n", __FUNCTION__);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
shader->program = glCreateProgram();
|
||||||
|
glAttachShader(shader->program, vertex_shader);
|
||||||
|
glAttachShader(shader->program, fragment_shader);
|
||||||
|
glLinkProgram(shader->program);
|
||||||
|
|
||||||
|
s32 is_program_linked;
|
||||||
|
glGetProgramiv(shader->program, GL_LINK_STATUS, &is_program_linked);
|
||||||
|
if (!is_program_linked) {
|
||||||
|
glDeleteShader(vertex_shader);
|
||||||
|
glDeleteShader(fragment_shader);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 ubo_index = glGetUniformBlockIndex(shader->program, "Matrices");
|
||||||
|
glUniformBlockBinding(shader->program, ubo_index, 0);
|
||||||
|
|
||||||
|
glDeleteShader(vertex_shader);
|
||||||
|
glDeleteShader(fragment_shader);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup_shader(Shader *shader) {
|
||||||
|
glDeleteProgram(shader->program);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 load_shader(string filepath, Shader_Type shader_type) {
|
||||||
|
string shader_as_text = load_file_to_string(filepath);
|
||||||
|
|
||||||
|
const char* shader_source = shader_as_text.c_str();
|
||||||
|
u32 shader = glCreateShader(shader_type);
|
||||||
|
glShaderSource(shader, 1, (const char**) &shader_source, 0);
|
||||||
|
glCompileShader(shader);
|
||||||
|
|
||||||
|
s32 is_shader_compiled;
|
||||||
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &is_shader_compiled);
|
||||||
|
if (!is_shader_compiled) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
void use_shader(Shader *shader) {
|
||||||
|
glUseProgram(shader->program);
|
||||||
|
}
|
||||||
21
src/shaders.h
Normal file
21
src/shaders.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "basic.h"
|
||||||
|
#include <glad/glad.h>
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum Shader_Type : u32 {
|
||||||
|
VERTEX_SHADER = GL_VERTEX_SHADER,
|
||||||
|
FRAGMENT_SHADER = GL_FRAGMENT_SHADER
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Shader {
|
||||||
|
u32 program = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool load_shaders(Shader *shader, string vertex_shader_filepath, string fragment_shader_filepath);
|
||||||
|
u32 load_shader(string filepath, Shader_Type shader_type);
|
||||||
|
void use_shader(Shader *shader);
|
||||||
|
void cleanup_shader(Shader *shader);
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user