diff --git a/Shaders/deferred_light/deferred_light.frag.glsl b/Shaders/deferred_light/deferred_light.frag.glsl index d7235920..f582dc97 100644 --- a/Shaders/deferred_light/deferred_light.frag.glsl +++ b/Shaders/deferred_light/deferred_light.frag.glsl @@ -331,7 +331,7 @@ void main() { #ifdef _VoxelAOvar #ifdef _VoxelShadow - svisibility *= 1.0 - traceShadow(voxels, voxpos, sunDir, 0.14, 5.0); + svisibility *= 1.0 - traceShadow(voxels, voxpos, sunDir); #endif #endif diff --git a/Shaders/std/conetrace.glsl b/Shaders/std/conetrace.glsl index c898e4ef..7be1242b 100755 --- a/Shaders/std/conetrace.glsl +++ b/Shaders/std/conetrace.glsl @@ -146,8 +146,25 @@ float traceConeAO(sampler3D voxels, const vec3 origin, vec3 dir, const float ape return sampleCol; } -float traceShadow(sampler3D voxels, const vec3 origin, const vec3 dir, const float aperture, const float targetDistance) { - return traceConeAO(voxels, origin, dir, aperture, targetDistance); +float traceConeAOShadow(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float maxDist, const float offset) { + dir = normalize(dir); + float sampleCol = 0.0; + float dist = 1.5 * VOXEL_SIZE * voxelgiOffset * 2.5; // + float diam = dist * aperture; + vec3 samplePos; + while (sampleCol < 1.0 && dist < maxDist) { + samplePos = dir * dist + origin; + float mip = max(log2(diam * voxelgiResolution.x), 0); + float mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5), mip).r; + sampleCol += (1 - sampleCol) * mipSample; + dist += max(diam / 2, VOXEL_SIZE); + diam = dist * aperture; + } + return sampleCol; +} + +float traceShadow(sampler3D voxels, const vec3 origin, const vec3 dir) { + return traceConeAO(voxels, origin, dir, 0.14 * voxelgiAperture, 2.5 * voxelgiRange); } float traceAO(const vec3 origin, const vec3 normal, sampler3D voxels) { diff --git a/Shaders/std/light.glsl b/Shaders/std/light.glsl index 9345faf1..b08cac85 100644 --- a/Shaders/std/light.glsl +++ b/Shaders/std/light.glsl @@ -105,7 +105,7 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co #ifdef _VoxelAOvar #ifdef _VoxelShadow - direct *= 1.0 - traceShadow(voxels, voxpos, l, 0.14, 5.0); + direct *= 1.0 - traceShadow(voxels, voxpos, l); #endif #endif diff --git a/blender/arm/material/make_mesh.py b/blender/arm/material/make_mesh.py index 3283c42e..69e7fb84 100644 --- a/blender/arm/material/make_mesh.py +++ b/blender/arm/material/make_mesh.py @@ -670,7 +670,7 @@ def make_forward_base(con_mesh, parse_opacity=False, transluc_pass=False): frag.write('svisibility = PCF(shadowMap, lPos.xy, lPos.z - shadowsBias, smSize);') frag.write('}') # receiveShadow if '_VoxelShadow' in wrd.world_defs and '_VoxelAOvar' in wrd.world_defs: - frag.write('svisibility *= 1.0 - traceShadow(voxels, voxpos, sunDir, 0.14, 5.0);') + frag.write('svisibility *= 1.0 - traceShadow(voxels, voxpos, sunDir);') frag.write('direct += (lambertDiffuseBRDF(albedo, sdotNL) + specularBRDF(f0, roughness, sdotNL, sdotNH, dotNV, sdotVH) * specular) * sunCol * svisibility;') # sun diff --git a/blender/arm/props_renderpath.py b/blender/arm/props_renderpath.py index 6f08ba28..9ce82f3d 100644 --- a/blender/arm/props_renderpath.py +++ b/blender/arm/props_renderpath.py @@ -418,6 +418,7 @@ class ArmRPListItem(bpy.types.PropertyGroup): arm_voxelgi_step: FloatProperty(name="Step", description="Step size", default=1.0, update=assets.invalidate_shader_cache) arm_voxelgi_offset: FloatProperty(name="Offset", description="Ray offset", default=1.0, update=assets.invalidate_shader_cache) arm_voxelgi_range: FloatProperty(name="Range", description="Maximum range", default=2.0, update=assets.invalidate_shader_cache) + arm_voxelgi_aperture: FloatProperty(name="Aperture", description="Cone aperture for shadow trace", default=1.0, update=assets.invalidate_shader_cache) arm_sss_width: FloatProperty(name="Width", description="SSS blur strength", default=1.0, update=assets.invalidate_shader_cache) arm_clouds_density: FloatProperty(name="Density", default=1.0, min=0.0, max=1.0, update=assets.invalidate_shader_cache) arm_clouds_size: FloatProperty(name="Size", default=1.0, min=0.0, max=10.0, update=assets.invalidate_shader_cache) diff --git a/blender/arm/props_ui.py b/blender/arm/props_ui.py index 798860be..659d6631 100644 --- a/blender/arm/props_ui.py +++ b/blender/arm/props_ui.py @@ -840,6 +840,7 @@ class ArmRenderPathVoxelsPanel(bpy.types.Panel): col.prop(rpdat, 'arm_voxelgi_step') col.prop(rpdat, 'arm_voxelgi_range') col.prop(rpdat, 'arm_voxelgi_offset') + col.prop(rpdat, 'arm_voxelgi_aperture') class ArmRenderPathWorldPanel(bpy.types.Panel): bl_label = "World" diff --git a/blender/arm/write_data.py b/blender/arm/write_data.py index af4356ab..83379b00 100755 --- a/blender/arm/write_data.py +++ b/blender/arm/write_data.py @@ -582,6 +582,7 @@ const float voxelgiEnv = """ + str(round(rpdat.arm_voxelgi_env * 100) / 100) + " const float voxelgiStep = """ + str(round(rpdat.arm_voxelgi_step * 100) / 100) + """; const float voxelgiRange = """ + str(round(rpdat.arm_voxelgi_range * 100) / 100) + """; const float voxelgiOffset = """ + str(round(rpdat.arm_voxelgi_offset * 100) / 100) + """; +const float voxelgiAperture = """ + str(round(rpdat.arm_voxelgi_aperture * 100) / 100) + """; """) if rpdat.rp_sss_state == 'On':