Skip to content

Commit

Permalink
Merge branch 'main' into GI
Browse files Browse the repository at this point in the history
  • Loading branch information
e2002e committed Feb 12, 2023
2 parents eb82333 + 61badbd commit 014df85
Show file tree
Hide file tree
Showing 14 changed files with 124 additions and 29 deletions.
10 changes: 6 additions & 4 deletions Shaders/deferred_light/deferred_light.frag.glsl
Expand Up @@ -357,12 +357,13 @@ fragColor.rgb = envl;

#ifdef _Sun
vec3 sh = normalize(v + sunDir);
float sdotNH = dot(n, sh);
float sdotVH = dot(v, sh);
float sdotNL = dot(n, sunDir);
float sdotNH = max(0.0, dot(n, sh));
float sdotVH = max(0.0, dot(v, sh));
float sdotNL = max(0.0, dot(n, sunDir));
float svisibility = 1.0;
vec3 sdirect = lambertDiffuseBRDF(albedo, sdotNL) + specularBRDF(f0, roughness, sdotNL, sdotNH, dotNV, sdotVH) * occspec.y;


#ifdef _ShadowMap
#ifdef _CSM
svisibility = shadowTestCascade(
Expand Down Expand Up @@ -406,7 +407,8 @@ fragColor.rgb = envl;
#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
8 changes: 4 additions & 4 deletions Shaders/deferred_light_mobile/deferred_light.frag.glsl
Expand Up @@ -185,12 +185,12 @@ void main() {

#ifdef _Sun
vec3 sh = normalize(v + sunDir);
float sdotNH = dot(n, sh);
float sdotVH = dot(v, sh);
float sdotNL = dot(n, sunDir);
float sdotNH = max(0.0, dot(n, sh));
float sdotVH = max(0.0, dot(v, sh));
float sdotNL = max(0.0, dot(n, sunDir));
float svisibility = 1.0;
vec3 sdirect = lambertDiffuseBRDF(albedo, sdotNL) +
specularBRDF(f0, roughness, sdotNL, sdotNH, dotNV, sdotVH) * occspec.y;
specularBRDF(f0, roughness, sdotNL, sdotNH, dotNV, sdotVH) * occspec.y;

#ifdef _ShadowMap
#ifdef _CSM
Expand Down
6 changes: 3 additions & 3 deletions Shaders/std/brdf.glsl
Expand Up @@ -77,7 +77,7 @@ vec3 orenNayarDiffuseBRDF(const vec3 albedo, const float roughness, const float
}

vec3 lambertDiffuseBRDF(const vec3 albedo, const float nl) {
return albedo * max(0.0, nl);
return albedo * nl;
}

vec3 surfaceAlbedo(const vec3 baseColor, const float metalness) {
Expand All @@ -100,13 +100,13 @@ float wardSpecular(vec3 N, vec3 H, float dotNL, float dotNV, float dotNH, vec3 f
// fiberDirection - parse from rotation
// shinyParallel - roughness
// shinyPerpendicular - anisotropy

vec3 fiberParallel = normalize(fiberDirection);
vec3 fiberPerpendicular = normalize(cross(N, fiberDirection));
float dotXH = dot(fiberParallel, H);
float dotYH = dot(fiberPerpendicular, H);
const float PI = 3.1415926535;
float coeff = sqrt(dotNL/dotNV) / (4.0 * PI * shinyParallel * shinyPerpendicular);
float coeff = sqrt(dotNL/dotNV) / (4.0 * PI * shinyParallel * shinyPerpendicular);
float theta = (pow(dotXH/shinyParallel, 2.0) + pow(dotYH/shinyPerpendicular, 2.0)) / (1.0 + dotNH);
return clamp(coeff * exp(-2.0 * theta), 0.0, 1.0);
}
Expand Down
25 changes: 21 additions & 4 deletions Shaders/std/light.glsl
Expand Up @@ -136,18 +136,35 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co
#endif
}
else direct = albedo;
float dotNH = max(0.0, dot(n, h));
float dotVH = max(0.0, dot(v, h));
float dotNL = max(0.0, dot(n, l));

direct *= lightCol;
direct *= attenuate(distance(p, lp));

direct *= lightCol;
direct *= attenuate(distance(p, lp));

if(!vox) {
if(!vox) {
#ifdef _MicroShadowing
direct *= dotNL + 2.0 * occ * occ - 1.0;
#endif

#ifdef _SSRS
direct *= traceShadowSS(l, p, gbufferD, invVP, eye);
#endif

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

#ifdef _SSRS
direct *= traceShadowSS(l, p, gbufferD, invVP, eye);
#endif

#ifdef _VoxelAOvar
#ifdef _VoxelShadow
direct *= 1.0 - traceShadow(voxels, voxpos, l);
#endif
#endif

#ifdef _VoxelAOvar
#ifdef _VoxelShadow
Expand Down
8 changes: 4 additions & 4 deletions Shaders/std/light_mobile.glsl
Expand Up @@ -57,11 +57,11 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co
vec3 ld = lp - p;
vec3 l = normalize(ld);
vec3 h = normalize(v + l);
float dotNH = dot(n, h);
float dotVH = dot(v, h);
float dotNL = dot(n, l);
float dotNH = max(0.0, dot(n, h));
float dotVH = max(0.0, dot(v, h));
float dotNL = max(0.0, dot(n, l));

vec3 direct = albedo * max(dotNL, 0.0) +
vec3 direct = lambertDiffuseBRDF(albedo, dotNL) +
specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec;

direct *= lightCol;
Expand Down
28 changes: 28 additions & 0 deletions Sources/armory/logicnode/CanvasGetTextNode.hx
@@ -0,0 +1,28 @@
package armory.logicnode;

import iron.Scene;
import armory.trait.internal.CanvasScript;

class CanvasGetTextNode extends LogicNode {

var canvas: CanvasScript;

public function new(tree: LogicTree) {
super(tree);
}

#if arm_ui
override function get(from: Int) {
if (canvas == null) canvas = Scene.active.getTrait(CanvasScript);
if (canvas == null) canvas = Scene.active.camera.getTrait(CanvasScript);
if (canvas == null || !canvas.ready) return null;

// This Try/Catch hacks around an issue where the handles are
// not created yet, even though canvas.ready is true.
try {
return canvas.getElement(inputs[0].get()).text;
}
catch (e: Dynamic) { return null; }
}
#end
}
14 changes: 14 additions & 0 deletions Sources/armory/logicnode/MathNode.hx
Expand Up @@ -15,6 +15,18 @@ class MathNode extends LogicNode {
return Math.round(number) / Math.pow(10, precision);
}

public function fract(a: Float): Float {
return a - Math.floor(a);
}

public function pingpong(a: Float, b: Float): Float {
if (b == 0.0) {
return 0.0;
} else {
return Math.abs(fract((a - b) / (b * 2.0)) * b * 2.0 - b);
}
}

override function get(from: Int): Dynamic {
var r = 0.0;
switch (property0) {
Expand Down Expand Up @@ -84,6 +96,8 @@ class MathNode extends LogicNode {
r /= inputs[i].get();
i++;
}
case "Ping-Pong":
r = pingpong(inputs[0].get(), inputs[1].get());
}
// Clamp
if (property1) r = r < 0.0 ? 0.0 : (r > 1.0 ? 1.0 : r);
Expand Down
12 changes: 12 additions & 0 deletions blender/arm/logicnode/LN_get_canvas_text.py
@@ -0,0 +1,12 @@
from arm.logicnode.arm_nodes import *

class CanvasGetTextNode(ArmLogicTreeNode):
"""Sets the text of the given UI element."""
bl_idname = 'LNCanvasGetTextNode'
bl_label = 'Get Canvas Text'
arm_version = 1

def arm_init(self, context):
self.add_input('ArmStringSocket', 'Element')

self.add_output('ArmStringSocket', 'String')
12 changes: 8 additions & 4 deletions blender/arm/logicnode/math/LN_math.py
Expand Up @@ -4,7 +4,7 @@ class MathNode(ArmLogicTreeNode):
"""Mathematical operations on values."""
bl_idname = 'LNMathNode'
bl_label = 'Math'
arm_version = 2
arm_version = 3

@staticmethod
def get_enum_id_value(obj, prop_name, value):
Expand Down Expand Up @@ -37,7 +37,8 @@ def get_count_in(operation_name):
'Arctan2': 2,
'Modulo': 2,
'Less Than': 2,
'Greater Than': 2
'Greater Than': 2,
'Ping-Pong': 2
}.get(operation_name, 0)

def get_enum(self):
Expand All @@ -52,7 +53,7 @@ def set_enum(self, value):
if (self.get_count_in(select_current) == 0):
while (len(self.inputs) < 2):
self.add_input('ArmFloatSocket', 'Value ' + str(len(self.inputs)))
# 2 arguments: Max, Min, Power, Arctan2, Modulo, Less Than, Greater Than
# 2 arguments: Max, Min, Power, Arctan2, Modulo, Less Than, Greater Than, Ping-Pong
if (self.get_count_in(select_current) == 2):
while (len(self.inputs) > 2):
self.inputs.remove(self.inputs.values()[-1])
Expand All @@ -65,6 +66,8 @@ def set_enum(self, value):
self['property0'] = value
if (self.property0 == 'Round'):
self.inputs[1].name = 'Precision'
elif (self.property0 == 'Ping-Pong'):
self.inputs[1].name = 'Scale'
elif (len(self.inputs) > 1): self.inputs[1].name = 'Value 1'

property0: HaxeEnumProperty(
Expand Down Expand Up @@ -93,7 +96,8 @@ def set_enum(self, value):
('Ceil', 'Ceil', 'Ceil'),
('Fract', 'Fract', 'Fract'),
('Square Root', 'Square Root', 'Square Root'),
('Exponent', 'Exponent', 'Exponent')],
('Exponent', 'Exponent', 'Exponent'),
('Ping-Pong', 'Ping-Pong', 'The output value is moved between 0.0 and the Scale based on the input value')],
name='', default='Add', set=set_enum, get=get_enum)

property1: HaxeBoolProperty('property1', name='Clamp', default=False)
Expand Down
17 changes: 16 additions & 1 deletion 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 @@ -84,6 +96,9 @@ def write(vert, frag):
frag.write(', occlusion')
if '_SSRS' in wrd.world_defs:
frag.write(', gbufferD, invVP, eye')
if '_MicroShadowing' in wrd.world_defs and not is_mobile:
frag.write('\t, occlusion')

frag.write(');')

frag.write('}') # for numLights
1 change: 1 addition & 0 deletions blender/arm/material/make_mesh.py
Expand Up @@ -776,6 +776,7 @@ def make_forward_base(con_mesh, parse_opacity=False, transluc_pass=False):
frag.write(', occlusion')
if '_SSRS' in wrd.world_defs:
frag.write(', gbufferD, invVP, eye')

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 @@ -151,7 +151,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 @@ -467,7 +467,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 @@ -1805,9 +1805,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 014df85

Please sign in to comment.