From fe9fa0eea9f8567c8de1829b88be29247d611883 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Wed, 3 Oct 2018 13:59:34 +0200 Subject: [PATCH] Apply reflection plane --- Shaders/deferred_light/deferred_light.json | 4 +- ...volume.vert.glsl => pass_volume.vert.glsl} | 4 +- Shaders/probe_planar/probe_planar.frag.glsl | 54 +++++++++++-------- Shaders/probe_planar/probe_planar.json | 16 +++--- .../volumetric_light/volumetric_light.json | 4 +- .../armory/renderpath/RenderPathDeferred.hx | 42 ++++++++------- blender/arm/exporter.py | 12 ++--- 7 files changed, 75 insertions(+), 61 deletions(-) rename Shaders/include/{pass_light_volume.vert.glsl => pass_volume.vert.glsl} (61%) diff --git a/Shaders/deferred_light/deferred_light.json b/Shaders/deferred_light/deferred_light.json index 38867e2f..16523a53 100755 --- a/Shaders/deferred_light/deferred_light.json +++ b/Shaders/deferred_light/deferred_light.json @@ -14,7 +14,7 @@ "alpha_blend_operation": "add", "links": [ { - "name": "LVWVP", + "name": "VWVP", "link": "_lightVolumeWorldViewProjectionMatrix" }, { @@ -117,7 +117,7 @@ "ifdef": ["_DFRS"] } ], - "vertex_shader": "../include/pass_light_volume.vert.glsl", + "vertex_shader": "../include/pass_volume.vert.glsl", "fragment_shader": "deferred_light.frag.glsl" } ] diff --git a/Shaders/include/pass_light_volume.vert.glsl b/Shaders/include/pass_volume.vert.glsl similarity index 61% rename from Shaders/include/pass_light_volume.vert.glsl rename to Shaders/include/pass_volume.vert.glsl index 7d54f388..583ec628 100644 --- a/Shaders/include/pass_light_volume.vert.glsl +++ b/Shaders/include/pass_volume.vert.glsl @@ -1,12 +1,12 @@ #version 450 -uniform mat4 LVWVP; +uniform mat4 VWVP; in vec3 pos; out vec4 wvpposition; void main() { - wvpposition = LVWVP * vec4(pos, 1.0); + wvpposition = VWVP * vec4(pos, 1.0); gl_Position = wvpposition; } diff --git a/Shaders/probe_planar/probe_planar.frag.glsl b/Shaders/probe_planar/probe_planar.frag.glsl index 6bee0fd9..3e1e5550 100644 --- a/Shaders/probe_planar/probe_planar.frag.glsl +++ b/Shaders/probe_planar/probe_planar.frag.glsl @@ -3,17 +3,12 @@ #include "compiled.inc" #include "std/gbuffer.glsl" -uniform sampler2D tex; - -// // uniform sampler2D gbufferD; -// uniform sampler2D gbuffer0; -// uniform sampler2D gbuffer1; -// #ifdef _gbuffer2direct -// uniform sampler2D gbuffer2; -// #endif - -// uniform mat4 invVP; -// uniform vec3 eye; +uniform sampler2D planeTex; +uniform sampler2D gbuffer0; +uniform sampler2D gbuffer1; +uniform mat4 probeVP; +uniform mat4 invVP; +uniform vec3 proben; in vec4 wvpposition; out vec4 fragColor; @@ -25,16 +20,31 @@ void main() { texCoord.y = 1.0 - texCoord.y; #endif - fragColor.rgb = texture(tex, texCoord).rgb; + vec4 g0 = texture(gbuffer0, texCoord); // Normal.xy, metallic/roughness, depth - // vec4 g0 = texture(gbuffer0, texCoord); // Normal.xy, metallic/roughness, depth - // vec4 g1 = texture(gbuffer1, texCoord); // Basecolor.rgb, spec/occ - // float depth = (1.0 - g0.a) * 2.0 - 1.0; - // vec3 n; - // n.z = 1.0 - abs(g0.x) - abs(g0.y); - // n.xy = n.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy); - // n = normalize(n); - // vec3 p = getPos2(invVP, depth, texCoord); - // vec2 metrough = unpackFloat(g0.b); - // vec3 v = normalize(eye - p); + float roughness = unpackFloat(g0.b).y; + if (roughness > 0.95) { + fragColor.rgb = vec3(0.0); + return; + } + + float spec = fract(texture(gbuffer1, texCoord).a); + if (spec == 0.0) { + fragColor.rgb = vec3(0.0); + return; + } + + float depth = (1.0 - g0.a) * 2.0 - 1.0; + vec3 wp = getPos2(invVP, depth, texCoord); + vec4 pp = probeVP * vec4(wp.xyz, 1.0); + vec2 tc = (pp.xy / pp.w) * 0.5 + 0.5; + + vec2 enc = g0.rg; + vec3 n; + n.z = 1.0 - abs(enc.x) - abs(enc.y); + n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy); + n = normalize(n); + + float intensity = clamp((1.0 - roughness) * dot(n, proben), 0.0, 1.0); + fragColor.rgb = texture(planeTex, tc).rgb * intensity; } diff --git a/Shaders/probe_planar/probe_planar.json b/Shaders/probe_planar/probe_planar.json index f4adf97a..767f913c 100644 --- a/Shaders/probe_planar/probe_planar.json +++ b/Shaders/probe_planar/probe_planar.json @@ -14,19 +14,23 @@ "alpha_blend_operation": "add", "links": [ { - "name": "LVWVP", + "name": "VWVP", "link": "_worldViewProjectionMatrix" }, - { - "name": "eye", - "link": "_cameraPosition" - }, { "name": "invVP", "link": "_inverseViewProjectionMatrix" + }, + { + "name": "probeVP", + "link": "_probeViewProjectionMatrix" + }, + { + "name": "proben", + "link": "_probeNormal" } ], - "vertex_shader": "../include/pass_light_volume.vert.glsl", + "vertex_shader": "../include/pass_volume.vert.glsl", "fragment_shader": "probe_planar.frag.glsl" } ] diff --git a/Shaders/volumetric_light/volumetric_light.json b/Shaders/volumetric_light/volumetric_light.json index fcf5fbaf..0dfa40d5 100755 --- a/Shaders/volumetric_light/volumetric_light.json +++ b/Shaders/volumetric_light/volumetric_light.json @@ -7,7 +7,7 @@ "cull_mode": "counter_clockwise", "links": [ { - "name": "LVWVP", + "name": "VWVP", "link": "_lightVolumeWorldViewProjectionMatrix" }, { @@ -52,7 +52,7 @@ } ], "texture_params": [], - "vertex_shader": "../include/pass_light_volume.vert.glsl", + "vertex_shader": "../include/pass_volume.vert.glsl", "fragment_shader": "volumetric_light.frag.glsl" } ] diff --git a/Sources/armory/renderpath/RenderPathDeferred.hx b/Sources/armory/renderpath/RenderPathDeferred.hx index 1077d110..ea93cc87 100644 --- a/Sources/armory/renderpath/RenderPathDeferred.hx +++ b/Sources/armory/renderpath/RenderPathDeferred.hx @@ -595,20 +595,20 @@ class RenderPathDeferred { path.drawShader("shader_datas/deferred_indirect/deferred_indirect"); } + var isProbe = iron.Scene.active.camera.renderTarget != null; #if rp_probes - if (iron.Scene.active.camera.renderTarget == null) { - - // path.bindTarget("_main", "gbufferD"); - // path.bindTarget("gbuffer0", "gbuffer0"); - // path.bindTarget("gbuffer1", "gbuffer1"); - // #if rp_gbuffer2_direct - // path.bindTarget("gbuffer2", "gbuffer2"); - // #end - + if (!isProbe) { // TODO: cull - for (p in iron.Scene.active.probes) { + var probes = iron.Scene.active.probes; + for (i in 0...probes.length) { + var p = probes[i]; + if (!p.visible) continue; + path.currentProbeIndex = i; + path.setTarget("tex"); - path.bindTarget(p.raw.name, "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("gbuffer1", "gbuffer1"); + path.bindTarget(p.raw.name, "planeTex"); path.drawVolume(p, "shader_datas/probe_planar/probe_planar"); } } @@ -905,7 +905,7 @@ class RenderPathDeferred { path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight"); #if (rp_antialiasing == "TAA") - path.setTarget("bufa"); + isProbe ? path.setTarget(framebuffer) : path.setTarget("bufa"); #else path.setTarget(framebuffer); #end @@ -920,15 +920,17 @@ class RenderPathDeferred { #if (rp_antialiasing == "TAA") { - path.setTarget(framebuffer); - path.bindTarget("bufa", "tex"); - path.bindTarget("taa", "tex2"); - path.bindTarget("gbuffer2", "sveloc"); - path.drawShader("shader_datas/taa_pass/taa_pass"); + if (!isProbe) { // No last frame for probe + path.setTarget(framebuffer); + path.bindTarget("bufa", "tex"); + path.bindTarget("taa", "tex2"); + path.bindTarget("gbuffer2", "sveloc"); + path.drawShader("shader_datas/taa_pass/taa_pass"); - path.setTarget("taa"); - path.bindTarget("bufa", "tex"); - path.drawShader("shader_datas/copy_pass/copy_pass"); + path.setTarget("taa"); + path.bindTarget("bufa", "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + } } #end } diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index 7cfc1d0b..9f1e0b63 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -956,13 +956,10 @@ class ArmoryExporter: for i in range(0, num_psys): self.export_particle_system_ref(bobject.particle_systems[i], i, o) - if bobject.type == 'LIGHT_PROBE': - o['dimensions'] = [1.0, 1.0, bobject.data.influence_distance] - else: - o['dimensions'] = [0.0, 0.0, 0.0] - for i in range(0, 3): - if bobject.scale[i] != 0: - o['dimensions'][i] = bobject.dimensions[i] / bobject.scale[i] + o['dimensions'] = [0.0, 0.0, 0.0] + for i in range(0, 3): + if bobject.scale[i] != 0: + o['dimensions'][i] = bobject.dimensions[i] / bobject.scale[i] # Origin not in geometry center if hasattr(bobject.data, 'arm_aabb'): dx = bobject.data.arm_aabb[0] @@ -991,6 +988,7 @@ class ArmoryExporter: self.probeArray[objref] = {"structName" : objname, "objectTable" : [bobject]} else: self.probeArray[objref]["objectTable"].append(bobject) + o['dimensions'] = [1.0, 1.0, bobject.data.influence_distance] o['data_ref'] = self.probeArray[objref]["structName"] elif type == NodeTypeCamera: