Skip to content

Commit

Permalink
Merge pull request armory3d#2795 from MoritzBrueckner/fix-microshadowing
Browse files Browse the repository at this point in the history
Various micro shadowing fixes and improvements
  • Loading branch information
luboslenco committed Feb 11, 2023
2 parents 175eebd + deb23ce commit 2b2a69e
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 9 deletions.
3 changes: 2 additions & 1 deletion Shaders/deferred_light/deferred_light.frag.glsl
Expand Up @@ -391,7 +391,8 @@ void main() {
#endif

#ifdef _MicroShadowing
svisibility *= sdotNL + 2.0 * occspec.x * occspec.x - 1.0;
// See https://advances.realtimerendering.com/other/2016/naughty_dog/NaughtyDog_TechArt_Final.pdf
svisibility *= clamp(sdotNL + 2.0 * occspec.x * occspec.x - 1.0, 0.0, 1.0);
#endif

fragColor.rgb += sdirect * svisibility * sunCol;
Expand Down
2 changes: 1 addition & 1 deletion Shaders/std/light.glsl
Expand Up @@ -129,7 +129,7 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co
direct *= lightCol;

#ifdef _MicroShadowing
direct *= dotNL + 2.0 * occ * occ - 1.0;
direct *= clamp(dotNL + 2.0 * occ * occ - 1.0, 0.0, 1.0);
#endif

#ifdef _SSRS
Expand Down
18 changes: 16 additions & 2 deletions blender/arm/material/make_cluster.py
@@ -1,7 +1,19 @@
import bpy

def write(vert, frag):
import arm.material.shader as shader
import arm.utils

if arm.is_reload(__name__):
shader = arm.reload_module(shader)
arm.utils = arm.reload_module(arm.utils)
else:
arm.enable_reload(__name__)


def write(vert: shader.Shader, frag: shader.Shader):
wrd = bpy.data.worlds['Arm']
rpdat = arm.utils.get_rp()
is_mobile = rpdat.arm_material_model == 'Mobile'
is_shadows = '_ShadowMap' in wrd.world_defs
is_shadows_atlas = '_ShadowMapAtlas' in wrd.world_defs
is_single_atlas = '_SingleAtlas' in wrd.world_defs
Expand Down Expand Up @@ -72,7 +84,9 @@ def write(vert, frag):
frag.write('\t, vec2(lightsArray[li * 3].w, lightsArray[li * 3 + 1].w)') # scale
frag.write('\t, lightsArraySpot[li * 2 + 1].xyz') # right
if '_VoxelShadow' in wrd.world_defs and '_VoxelAOvar' in wrd.world_defs:
frag.write(' , voxels, voxpos')
frag.write('\t, voxels, voxpos')
if '_MicroShadowing' in wrd.world_defs and not is_mobile:
frag.write('\t, occlusion')
frag.write(');')

frag.write('}') # for numLights
2 changes: 2 additions & 0 deletions blender/arm/material/make_mesh.py
Expand Up @@ -709,6 +709,8 @@ def make_forward_base(con_mesh, parse_opacity=False, transluc_pass=False):
frag.write(' , true, spotData.x, spotData.y, spotDir, spotData.zw, spotRight')
if '_VoxelShadow' in wrd.world_defs and '_VoxelAOvar' in wrd.world_defs:
frag.write(' , voxels, voxpos')
if '_MicroShadowing' in wrd.world_defs:
frag.write(' , occlusion')
frag.write(');')

if '_Clusters' in wrd.world_defs:
Expand Down
2 changes: 1 addition & 1 deletion blender/arm/material/shader.py
Expand Up @@ -201,8 +201,8 @@ def make_tese(self, custom_name: str = None):
self.tese = Shader(self, 'tese')
return self.tese

class Shader:

class Shader:
def __init__(self, context, shader_type):
self.context = context
self.shader_type = shader_type
Expand Down
4 changes: 2 additions & 2 deletions blender/arm/props_renderpath.py
Expand Up @@ -150,7 +150,7 @@ def update_preset(self, context):
rpdat.rp_volumetriclight = False
rpdat.rp_ssgi = 'RTAO'
rpdat.arm_ssrs = False
rpdat.arm_micro_shadowing = False
rpdat.arm_micro_shadowing = True
rpdat.rp_ssr = True
rpdat.arm_ssr_half_res = False
rpdat.rp_bloom = True
Expand Down Expand Up @@ -461,7 +461,7 @@ class ArmRPListItem(bpy.types.PropertyGroup):
name="Resolution Z", description="3D texture z resolution multiplier", default='1.0', update=update_renderpath)
arm_clouds: BoolProperty(name="Clouds", description="Enable clouds pass", default=False, update=assets.invalidate_shader_cache)
arm_ssrs: BoolProperty(name="SSRS", description="Screen-space ray-traced shadows", default=False, update=assets.invalidate_shader_cache)
arm_micro_shadowing: BoolProperty(name="Micro Shadowing", description="Micro shadowing based on ambient occlusion", default=False, update=assets.invalidate_shader_cache)
arm_micro_shadowing: BoolProperty(name="Micro Shadowing", description="Use the shaders' occlusion parameter to compute micro shadowing for the scene's sun lamp. This option is not available for render paths using mobile or solid material models", default=False, update=assets.invalidate_shader_cache)
arm_texture_filter: EnumProperty(
items=[('Anisotropic', 'Anisotropic', 'Anisotropic'),
('Linear', 'Linear', 'Linear'),
Expand Down
6 changes: 4 additions & 2 deletions blender/arm/props_ui.py
Expand Up @@ -1798,9 +1798,11 @@ def draw(self, context):
sub.prop(rpdat, 'arm_ssgi_radius')
sub.prop(rpdat, 'arm_ssgi_strength')
sub.prop(rpdat, 'arm_ssgi_max_steps')
layout.separator(factor=0.5)
layout.separator()

layout.prop(rpdat, 'arm_micro_shadowing')
row = layout.row()
row.enabled = rpdat.arm_material_model == 'Full'
row.prop(rpdat, 'arm_micro_shadowing')
layout.separator()

col = layout.column()
Expand Down

0 comments on commit 2b2a69e

Please sign in to comment.