From e588d897a398212da68972420cd6544d004c69b4 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Tue, 13 Oct 2020 15:09:23 -0400 Subject: [PATCH] move default shaders into a source file --- src/default_shaders.cpp | 66 +++++++++++++++++++++++++++++++++++++++++ src/renderer.cpp | 26 ++-------------- 2 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 src/default_shaders.cpp diff --git a/src/default_shaders.cpp b/src/default_shaders.cpp new file mode 100644 index 0000000..8ec9662 --- /dev/null +++ b/src/default_shaders.cpp @@ -0,0 +1,66 @@ +const char* DEFAULT_VERTEX_SHADER = R"VS( +#version 330 core + +layout (location = 0) in vec3 vertexPosition_modelspace; +layout (location = 1) in vec3 normal; +layout (location = 2) in vec3 texCoord; + +out vec3 fragVertex; +out vec3 fragNormal; +out vec2 fragUV; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + fragNormal = normal; + fragVertex = vertexPosition_modelspace; + fragUV = texCoord.st; + gl_Position = projection * view * model * vec4(vertexPosition_modelspace, 1); +} +)VS"; + +const char* DEFAULT_FRAGMENT_SHADER = R"FS( +#version 330 core + +//in vec3 fragColor; // NOTE: removing this line fails to link program... somehow? +in vec3 fragVertex; +in vec3 fragNormal; +in vec2 fragUV; + +out vec4 color; + +uniform mat4 model; +uniform mat3 normal_matrix; + +struct point_light { + uint light_ID; + vec3 position; + vec3 color; + float intensity; +}; +#define MAX_LIGHTS 10 +uniform point_light lights[MAX_LIGHTS]; +uniform uint num_lights = 0u; + +uniform sampler2D sampler; + + +void main() +{ + vec3 normal = normalize(normal_matrix * fragNormal); + vec3 fragPosition = vec3(model * vec4(fragVertex, 1)); + float totalBrightness = 0; + + for (uint i = 0u; i < num_lights; i++) { + vec3 surfaceToLight = lights[i].position - fragPosition; + float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); + totalBrightness += brightness; + } + + color = clamp(totalBrightness, 0, 1) * texture(sampler, fragUV.st); +} +)FS"; + diff --git a/src/renderer.cpp b/src/renderer.cpp index e6fba78..c982d10 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -12,11 +12,9 @@ #include #include "dumbLog.h" - #include "renderer.h" +#include "default_shaders.cpp" -#define DEFAULT_VERTEX_SHADER_FILE "../data/default.vs" -#define DEFAULT_FRAGMENT_SHADER_FILE "../data/default.fs" #define MAX_LIGHTS 10 // NOTE: needs to match the fragment shader source #define DEFAULT_PALETTE_DIR "../data" #define DEFAULT_PALETTE_FILE "palette.png" @@ -35,7 +33,6 @@ void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, bool initSDL(SDL_Handles& handles, v2i& viewport_dims); bool initContext(SDL_Handles& handles); bool initGL(); -bool initShaders(render_state* rs); bool initPalette(uint palette_id, util_image& image); bool initDebugRenderGroup(render_state* rs); void setDefaults(render_state* rs); @@ -52,7 +49,7 @@ renInit() if (initSDL(rs->handles, rs->viewport_dims) && initContext(rs->handles) && initGL() && - initShaders(rs) && + rgInitShaderProgram(rs->default_shader, DEFAULT_VERTEX_SHADER, DEFAULT_FRAGMENT_SHADER) && initPalette(rs->palette_id, rs->palette_image) && initDebugRenderGroup(rs) ) { @@ -212,25 +209,6 @@ initGL() return true; } -bool -initShaders(render_state* rs) -{ - const char* vs_code = utilDumpTextFile(DEFAULT_VERTEX_SHADER_FILE); - const char* fs_code = utilDumpTextFile(DEFAULT_FRAGMENT_SHADER_FILE); - - bool shader_error = !rgInitShaderProgram(rs->default_shader, vs_code, fs_code); - - utilSafeFree(vs_code); - utilSafeFree(fs_code); - - if (shader_error) { - LOG(Error) << "Error initializing shader program\n"; - return false; - } - - return true; -} - bool initPalette(uint palette_id, util_image& image) {