summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x3ner.cginc5
-rw-r--r--data.cginc3
-rw-r--r--late_pbr.cginc27
-rwxr-xr-xlighting.cginc8
-rw-r--r--matcap.cginc2
-rwxr-xr-xpbr.cginc11
-rw-r--r--ssfd.cginc3
7 files changed, 42 insertions, 17 deletions
diff --git a/3ner.cginc b/3ner.cginc
index e5dd027..502fe8e 100755
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -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);
diff --git a/data.cginc b/data.cginc
index b2ddb25..0923da3 100644
--- a/data.cginc
+++ b/data.cginc
@@ -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;
diff --git a/pbr.cginc b/pbr.cginc
index f81f95e..2ddcdbf 100755
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -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);
diff --git a/ssfd.cginc b/ssfd.cginc
index 1eec6d7..cc7d304 100644
--- a/ssfd.cginc
+++ b/ssfd.cginc
@@ -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