From 1026a2c791b9219a343cf09c2dcac80cb4930229 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sun, 8 Sep 2019 23:47:07 -0400 Subject: [PATCH] move shaders into separate files --- cosets/CMakeLists.txt | 7 ++++++ cosets/src/main.cpp | 41 ++++++++------------------------- cosets/src/shaders/main.fs.glsl | 13 +++++++++++ cosets/src/shaders/main.vs.glsl | 14 +++++++++++ cosets/src/util/files.hpp | 19 +++++++++++++++ cosets/src/util/shader.hpp | 7 ++++++ 6 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 cosets/src/shaders/main.fs.glsl create mode 100644 cosets/src/shaders/main.vs.glsl create mode 100644 cosets/src/util/files.hpp diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index 79a4510..dfa29e2 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -8,3 +8,10 @@ target_link_libraries(${PROJECT_NAME} target_include_directories(${PROJECT_NAME} PRIVATE include) + +add_custom_command( + TARGET cosets POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders + ${CMAKE_CURRENT_BINARY_DIR}/shaders +) diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index eedb1fa..8531459 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -17,38 +17,15 @@ class CosetsWindow : public Window { public: void init() override { - auto vs = build_shader(GL_VERTEX_SHADER, "vertex", - "#version 400\n" - "" - "uniform mat4 proj;" - "" - "in vec4 pos;" - "out vec4 v;" - "" - "void main(){" - " v = pos;" - "" - " /* stereographic projection */" - " vec4 vert = vec4(pos.xyz / (1 - pos.w), 1);" - " gl_Position = proj * vert;" - "}"); + auto vs = build_shader_file( + GL_VERTEX_SHADER, + "vertex", + "shaders/main.vs.glsl"); - auto fs = build_shader(GL_FRAGMENT_SHADER, "fragment", - "#version 400\n" - "" - "in vec4 v;" - "" - "vec3 hsv2rgb(vec3 c)\n" - "{\n" - " vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" - " vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n" - " return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n" - "}" - "" - "void main(){" - " gl_FragColor = vec4(hsv2rgb(vec3(v.w, 1, 1)), 0);" - "}" - ); + auto fs = build_shader_file( + GL_FRAGMENT_SHADER, + "fragment", + "shaders/main.fs.glsl"); program = build_program("main", vs, fs); @@ -123,4 +100,4 @@ int main(int argc, char *argv[]) { glfwTerminate(); return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/cosets/src/shaders/main.fs.glsl b/cosets/src/shaders/main.fs.glsl new file mode 100644 index 0000000..25a8486 --- /dev/null +++ b/cosets/src/shaders/main.fs.glsl @@ -0,0 +1,13 @@ +#version 400 + +in vec4 v; + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main(){ + gl_FragColor = vec4(hsv2rgb(vec3(v.w, 1, 1)), 0); +} diff --git a/cosets/src/shaders/main.vs.glsl b/cosets/src/shaders/main.vs.glsl new file mode 100644 index 0000000..01f2172 --- /dev/null +++ b/cosets/src/shaders/main.vs.glsl @@ -0,0 +1,14 @@ +#version 400 + +uniform mat4 proj; + +in vec4 pos; +out vec4 v; + +void main(){ + v = pos; + + /* stereographic projection */ + vec4 vert = vec4(pos.xyz / (1 - pos.w), 1); + gl_Position = proj * vert; +} diff --git a/cosets/src/util/files.hpp b/cosets/src/util/files.hpp new file mode 100644 index 0000000..03b3541 --- /dev/null +++ b/cosets/src/util/files.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include + +std::string read_all_text(const std::string &file) { + std::ifstream f(file); + std::string text; + + f.seekg(0, std::ios::end); + text.reserve(f.tellg()); + f.seekg(0, std::ios::beg); + + text.assign((std::istreambuf_iterator(f)), + std::istreambuf_iterator()); + + return text; +} diff --git a/cosets/src/util/shader.hpp b/cosets/src/util/shader.hpp index 7db357c..cfa2d0c 100644 --- a/cosets/src/util/shader.hpp +++ b/cosets/src/util/shader.hpp @@ -5,6 +5,8 @@ #include #include +#include "files.hpp" + GLint build_shader(GLenum type, const std::string &name, const std::string &src) { const char *c_str = src.c_str(); @@ -28,6 +30,11 @@ GLint build_shader(GLenum type, const std::string &name, const std::string &src) return s; } +GLint build_shader_file(GLenum type, const std::string &name, const std::string &file) { + std::string src = read_all_text(file); + return build_shader(type, name, src); +} + GLint build_program(const std::string &name, GLint vs, GLint fs) { GLint p = glCreateProgram(); glAttachShader(p, vs);