From 95d698146179437211c42bd09c2e9f225754cf63 Mon Sep 17 00:00:00 2001 From: Peder Bergebakken Sundt Date: Sun, 7 Apr 2019 00:03:03 +0200 Subject: [PATCH] Add support for fog into the scene shader --- res/shaders/simple.frag | 18 +++++++++++++++--- src/renderlogic.cpp | 15 +++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/res/shaders/simple.frag b/res/shaders/simple.frag index 6317240..ac22e86 100644 --- a/res/shaders/simple.frag +++ b/res/shaders/simple.frag @@ -27,6 +27,9 @@ uniform vec3 specular_color; uniform vec3 emissive_color; uniform vec3 backlight_color; +uniform vec3 fog_color; +uniform float fog_strength; + uniform bool isIlluminated; uniform bool isTextured; uniform bool isVertexColored; @@ -138,7 +141,15 @@ vec3 phong(vec3 basecolor, vec3 nnormal) { return basecolor + specular_color * specular_component; } +const float near = 0.1; +const float far = 5000.0; +float linearDepth() { + float z = gl_FragCoord.z * 2.0 - 1.0; + return (2.0 * near * far) / (far + near - z * (far - near)); +} + void main() { + vec3 nnormal = get_nnormal(); // normalized normal vec4 c = vec4(vec3(1.0), opacity); if (isVertexColored) c *= color; @@ -152,8 +163,9 @@ void main() { } if (backlight_strength > 0.05) c.rgb += backlight_color * clamp((dot(normalize(vertex), nnormal) + backlight_strength) / backlight_strength, 0, 1); - //c.rgb = diffuse_color; - //c.rgb = emissive_color; - //c.rgb = specular_color; + + float fog = linearDepth()/1500; + c.rgb = mix(c.rgb, fog_color, pow(fog,1.2)*fog_strength); + color_out = c; } diff --git a/src/renderlogic.cpp b/src/renderlogic.cpp index 40da540..3a84387 100644 --- a/src/renderlogic.cpp +++ b/src/renderlogic.cpp @@ -30,6 +30,9 @@ sf::SoundBuffer* buffer; Gloom::Shader* current_shader = nullptr; Gloom::Shader* prev_shader = nullptr; // The last shader to glDrawElements +// uniforms in the scene +vec3 fog_color = vec3(0); +float fog_strength = 0; // the framebuffer we render the scene to before post-processing GLuint framebufferID = 0; @@ -246,14 +249,18 @@ void renderNode(SceneNode* node, Gloom::Shader* parent_shader, vectorhas_transparancy()) { // defer to sorted pass later on - //transparent_nodes->emplace_back(node, s, glm::length(vec3(node->MVP[3]))); - //transparent_nodes->push_back({node, s, glm::length(vec3(node->MVP[3]))}); transparent_nodes->emplace_back(node, s, glm::length(vec3(node->MVP*vec4(0,0,0,1)))); - //transparent_nodes->push_back({node, s, glm::length(vec3(node->MVP*vec4(0,0,0,1)))}); } else if(node->vertexArrayObjectID != -1) { if (node->opacity <= 0.05) break; - // load uniforms + + // load scene uniforms + if (shader_changed) { // guaranteed at start of every frame, due to post_shader + glUniform3fv(s->location("fog_color"), 1, glm::value_ptr(fog_color)); + glUniform1f( s->location("fog_strength"), fog_strength); + } + + // load material uniforms um4fv(MVP); um4fv(MV); um4fv(MVnormal);