diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-24 18:23:53 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-24 18:23:53 -0700 |
| commit | 58a8ad92f766baddb2c832597a43088def456d82 (patch) | |
| tree | 5a8b6868847ecd7234e7b52992be002abef6b281 | |
| parent | 81637c1a3fab4f92e6da7517dd118d5bb4526865 (diff) | |
Refactor ssdf and matcaps/rl into "late pbr" stage; implement ssdf shadows
| -rwxr-xr-x | 3ner.cginc | 5 | ||||
| -rw-r--r-- | data.cginc | 3 | ||||
| -rw-r--r-- | late_pbr.cginc | 27 | ||||
| -rwxr-xr-x | lighting.cginc | 8 | ||||
| -rw-r--r-- | matcap.cginc | 2 | ||||
| -rwxr-xr-x | pbr.cginc | 11 | ||||
| -rw-r--r-- | ssfd.cginc | 3 |
7 files changed, 42 insertions, 17 deletions
@@ -17,9 +17,9 @@ #include "globals.cginc" #include "interpolators.cginc" #include "instancing.cginc" +#include "late_pbr.cginc" #include "ray_marching.cginc" #include "vertex.cginc" -#include "matcap.cginc" v2f vert(appdata v) { #if defined(SHADOW_CASTER_PASS) && !defined(_SHADOW_CASTER) @@ -318,7 +318,8 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace LightData light_data; GetLighting(i, pbr, light_data); - applyMatcapsAndRimLighting(i, pbr, light_data); + + latePbr(i, light_data, pbr); BrdfData bd; float4 lit = brdf(pbr, light_data, bd); @@ -75,6 +75,9 @@ struct LightIndirect { float3 specular_cc; #endif float3 diffuse; +#if defined(_SHADOWS) || defined(_SSFD) + float3 diffuse_dominant_dir; +#endif float3 L00; float3 L01r; diff --git a/late_pbr.cginc b/late_pbr.cginc new file mode 100644 index 0000000..5b1e324 --- /dev/null +++ b/late_pbr.cginc @@ -0,0 +1,27 @@ +#ifndef __LATE_PBR_INC +#define __LATE_PBR_INC + +#include "lighting.cginc" +#include "matcap.cginc" +#include "pbr.cginc" +#include "ssfd.cginc" + +void apply_ssfd(v2f i, float2 uv, LightData l, inout float3 albedo) { +#if defined(_SSFD) + float ssfd_mask = ssfd(uv, _SSFD_Scale, _SSFD_Max_Fwidth, 0, _SSFD_Noise); + float ssfd_mask_fw = fwidth(ssfd_mask); + // TODO I think anti aliasing is probably broken + float NoL = -dot(i.normal, l.indirect.diffuse_dominant_dir); + float ssfd_threshold = saturate(NoL * 0.5 + 0.5 + _SSFD_Threshold); + ssfd_mask = smoothstep(ssfd_threshold - ssfd_mask_fw * 0.5, ssfd_threshold + ssfd_mask_fw * 0.5, ssfd_mask); + albedo += ssfd_mask * _SSFD_Tint.rgb; +#endif +} + +void latePbr(v2f i, LightData l, inout Pbr pbr) { + apply_matcaps_and_rim_lighting(i, pbr, l); + apply_ssfd(i, i.uv01.xy, l, pbr.albedo.xyz); +} + +#endif // __LATE_PBR_INC + diff --git a/lighting.cginc b/lighting.cginc index 069abe9..0287f51 100755 --- a/lighting.cginc +++ b/lighting.cginc @@ -137,7 +137,7 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { #endif #endif -#if defined(_SHADOWS) +#if defined(_SHADOWS) || defined(_SSFD) float3x3 mat = float3x3( light.indirect.L01r, light.indirect.L01g, @@ -146,6 +146,10 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { // Multiply unit vector by L1 matrix to get vector pointing in direction of // light. float3 dom_dir = normalize(mul(mat, float3(1,1,1))); + light.indirect.diffuse_dominant_dir = dom_dir; +#endif + +#if defined(_SHADOWS) float light_amount = dot(dom_dir, pbr.normal); float3 shadow_color = lerp( _Shadow_0_Color.rgb, @@ -160,7 +164,7 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { #endif // _SHADOW_1 diffuse.xyz *= shadow_color; -#endif +#endif // _SHADOWS return diffuse; } diff --git a/matcap.cginc b/matcap.cginc index 462ba9b..150ed98 100644 --- a/matcap.cginc +++ b/matcap.cginc @@ -59,7 +59,7 @@ float2 quantizeMatcapUV(float2 muv, float muv_r, float steps) { } #endif // HAS_MATCAP_RL -void applyMatcapsAndRimLighting(v2f i, inout Pbr pbr, inout LightData light_data) { +void apply_matcaps_and_rim_lighting(v2f i, inout Pbr pbr, inout LightData light_data) { #if defined(HAS_MATCAP_RL) float2 muv = getMatcapUV(i, pbr); float2 muv_centered = muv * 2 - 1; @@ -7,7 +7,6 @@ #include "instancing.cginc" #include "interpolators.cginc" #include "letter_grid.cginc" -#include "ssfd.cginc" #include "texture_utils.cginc" #if defined(_PARALLAX_HEIGHTMAP) @@ -182,15 +181,6 @@ void apply_letter_grid(v2f i, inout Pbr pbr) { #endif } -void apply_ssfd(float2 uv, inout float3 albedo) { -#if defined(_SSFD) - float ssfd_mask = ssfd(uv, _SSFD_Scale, _SSFD_Max_Fwidth, 0, _SSFD_Noise); - float ssfd_mask_fw = fwidth(ssfd_mask); - ssfd_mask = smoothstep(_SSFD_Threshold - ssfd_mask_fw * 0.5, _SSFD_Threshold + ssfd_mask_fw * 0.5, ssfd_mask); - albedo += ssfd_mask * _SSFD_Tint.rgb; -#endif -} - Pbr getPbr(v2f i) { Pbr pbr = (Pbr) 0; @@ -236,7 +226,6 @@ Pbr getPbr(v2f i) { apply_marble(i.worldPos, pbr.albedo.xyz); apply_kintsugi(i.worldPos, pbr.albedo.xyz, pbr.smoothness, pbr.metallic); - apply_ssfd(i.uv01.xy, pbr.albedo.xyz); apply_letter_grid(i, pbr); applyDecals(i, pbr, normal_tangent); @@ -3,6 +3,7 @@ #include "globals.cginc" +#if defined(_SSFD) float ssfd(float2 uv, float scale, float max_fwidth, float2 uv_offset, texture3D noise) { //float uv_fw = fwidth(uv.x) + fwidth(uv.y); @@ -32,7 +33,6 @@ float ssfd(float2 uv, float scale, float max_fwidth, float2 uv_offset, texture3D // log_2(factor) is 4. // Divide original by 16. float fw_factor = uv_fw / max_fwidth; - // log_b(x) = log_a(x) / log_a(b) float fractal_level = log2(fw_factor) / log2(bayer_res); float fractal_level_floor = floor(fractal_level); float fractal_remainder = fractal_level - fractal_level_floor; @@ -52,6 +52,7 @@ float ssfd(float2 uv, float scale, float max_fwidth, float2 uv_offset, texture3D return dither; } +#endif // _SSFD #endif // __SSFD_INC |
