Apply reflection plane

This commit is contained in:
luboslenco 2018-10-03 13:59:34 +02:00
parent dfa834a70b
commit fe9fa0eea9
7 changed files with 75 additions and 61 deletions

View file

@ -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"
}
]

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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"
}
]

View file

@ -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"
}
]

View file

@ -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
}

View file

@ -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: