summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-16 15:51:20 -0700
committeryum <yum.food.vr@gmail.com>2026-03-16 15:51:29 -0700
commit7bfc0ecde84604abf8974ec2ffd1e9b0efb84bea (patch)
tree4473487cb2d9b06b8cd675bf363f84167684e1ca
parent50fcd18a2fb21cb19893c0c65310a525925c9177 (diff)
Add more debug views
-rwxr-xr-x3ner.cginc29
-rwxr-xr-x3ner.shader17
-rwxr-xr-xbrdf.cginc44
-rw-r--r--data.cginc17
-rw-r--r--debug.cginc62
-rwxr-xr-xfeatures.cginc31
-rwxr-xr-xmath.cginc2
-rwxr-xr-xpbr.cginc4
8 files changed, 141 insertions, 65 deletions
diff --git a/3ner.cginc b/3ner.cginc
index bd6880b..937cc3f 100755
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -9,6 +9,7 @@
#include "AutoLight.cginc"
#include "brdf.cginc"
+#include "debug.cginc"
#include "cnlohr.cginc"
#include "geometry.cginc"
#include "pbr.cginc"
@@ -301,6 +302,7 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace
#endif
// Convert normal and tangent to world space.
+ // `UnityObjectToWorldNormal` normalizes its output.
i.normal = UnityObjectToWorldNormal(i.normal);
i.tangent.xyz = UnityObjectToWorldNormal(i.tangent.xyz);
@@ -312,34 +314,13 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace
clip(pbr.albedo.a - 0.5);
}
-#if defined(_DEBUG_VIEW_UNLIT)
- return pbr.albedo;
-#elif defined(_DEBUG_VIEW_WORLD_SPACE_NORMALS)
- return float4((pbr.normal + 1.0f) * 0.5f, 1);
-#elif defined(_DEBUG_VIEW_OBJECT_SPACE_NORMALS)
- float3 normalOS = normalize(mul((float3x3)unity_WorldToObject, pbr.normal));
- return float4((normalOS + 1.0f) * 0.5f, 1);
-#elif defined(_DEBUG_VIEW_METALLIC_GLOSS)
- return float4(pbr.metallic, pbr.smoothness, 0, 1);
-#elif defined(_DEBUG_VIEW_DEPTH)
- float2 screen_uv = i.pos.xy / _ScreenParams.xy;
- float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, screen_uv);
- depth *= 100;
- depth *= depth;
- depth *= depth;
- depth *= 100;
- return float4(depth, depth, depth, 1);
-#endif
-
LightData light_data;
GetLighting(i, pbr, light_data);
applyMatcapsAndRimLighting(i, pbr, light_data);
-#if 0
- float c = light_data.common.NoV;
- return float4(c,c,c,1);
-#endif
- return brdf(pbr, light_data);
+ BrdfData bd;
+ float4 lit = brdf(pbr, light_data, bd);
+ return apply_debug_view(i, pbr, light_data, bd, lit);
}
#endif // __3NER_INC
diff --git a/3ner.shader b/3ner.shader
index 6683b2d..30a2c40 100755
--- a/3ner.shader
+++ b/3ner.shader
@@ -1063,6 +1063,23 @@ Shader "yum_food/3ner"
[ThryToggle(_DEBUG_VIEW_OBJECT_SPACE_NORMALS)] _Debug_View_Object_Space_Normals("Object space normals", Float) = 0
[ThryToggle(_DEBUG_VIEW_METALLIC_GLOSS)] _Debug_View_Metallic_Gloss("Metallic gloss", Float) = 0
[ThryToggle(_DEBUG_VIEW_DEPTH)] _Debug_View_Depth("Depth", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_DIRECT_NOH)] _Debug_View_Direct_NoH("Direct NoH", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_DIRECT_LOH)] _Debug_View_Direct_LoH("Direct LoH", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_DIRECT_NOL)] _Debug_View_Direct_NoL("Direct NoL", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_DIRECT_LOV)] _Debug_View_Direct_LoV("Direct LoV", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_DIRECT_COLOR)] _Debug_View_Direct_Color("Direct color", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_NOV)] _Debug_View_NoV("NoV", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_AO)] _Debug_View_AO("AO", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_INDIRECT_DIFFUSE)] _Debug_View_Indirect_Diffuse("Indirect diffuse", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_INDIRECT_SPECULAR)] _Debug_View_Indirect_Specular("Indirect specular", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_D)] _Debug_View_BRDF_D("BRDF D (distribution)", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_F)] _Debug_View_BRDF_F("BRDF F (fresnel)", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_G)] _Debug_View_BRDF_G("BRDF G (geometry)", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_DFG)] _Debug_View_BRDF_DFG("BRDF DFG (IBL LUT)", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_D_CC)] _Debug_View_BRDF_D_CC("BRDF D clearcoat", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_F_CC)] _Debug_View_BRDF_F_CC("BRDF F clearcoat", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_G_CC)] _Debug_View_BRDF_G_CC("BRDF G clearcoat", Float) = 0
+ [ThryToggle(_DEBUG_VIEW_BRDF_DFG_CC)] _Debug_View_BRDF_DFG_CC("BRDF DFG clearcoat", Float) = 0
[HideInInspector] m_end_Debug_Views("Debug Views", Float) = 0
[DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0
diff --git a/brdf.cginc b/brdf.cginc
index 2b1b754..cdf09fd 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -20,11 +20,6 @@ float Fd_Lambertian(float NoL) {
// Equation 24.
// f0: Reflectance at normal incidence. Typically around 0.04.
// f90: Reflectance at grazing incidence. Typically around 1.0.
-float F_Schlick(float LoH, float f0, float f90) {
- float term5 = pow5(1.0f - LoH);
- return f0 + (f90 - f0) * term5;
-}
-
float3 F_Schlick(float LoH, float3 f0, float f90) {
float term5 = pow5(1.0f - LoH);
float3 f90v = float3(f90, f90, f90);
@@ -66,7 +61,8 @@ float G_GGXSmith(float roughness, float NoL, float NoV) {
return rcp(denom);
}
-float4 brdf(Pbr pbr, LightData data) {
+float4 brdf(Pbr pbr, LightData data, out BrdfData bd) {
+ bd = (BrdfData)0;
float3 specular = 0;
float3 diffuse = 0;
@@ -86,28 +82,26 @@ float4 brdf(Pbr pbr, LightData data) {
float f0 = 0.04f;
const float f90 = 1.0f;
float2 dfg_uv = float2(data.common.NoV, pbr.roughness_perceptual);
- float3 dfg;
[branch]
if (textureExists(_DFG_LUT)) {
- dfg = _DFG_LUT.SampleLevel(bilinear_clamp_s, dfg_uv, 0).rgb;
+ bd.ibl_dfg = _DFG_LUT.SampleLevel(bilinear_clamp_s, dfg_uv, 0).rgb;
} else {
- dfg = float3(1, 1, 1);
+ bd.ibl_dfg = float3(1, 1, 1);
}
float3 f0_color = lerp(f0, pbr.albedo.xyz, pbr.metallic);
- float3 energy_comp = 1.0f + f0_color * (1.0f / (dfg.xxx + dfg.yyy) - 1.0f);
+ float3 energy_comp = 1.0f + f0_color * (1.0f / (bd.ibl_dfg.xxx + bd.ibl_dfg.yyy) - 1.0f);
#if defined(_CLEARCOAT)
const float cc_f0 = 0.04f;
float2 cc_dfg_uv = float2(data.common.NoV_cc, pbr.cc_roughness_perceptual);
- float3 cc_dfg;
[branch]
if (textureExists(_DFG_LUT)) {
- cc_dfg = _DFG_LUT.SampleLevel(bilinear_clamp_s, cc_dfg_uv, 0).rgb;
+ bd.ibl_dfg_cc = _DFG_LUT.SampleLevel(bilinear_clamp_s, cc_dfg_uv, 0).rgb;
} else {
- cc_dfg = float3(1, 1, 1);
+ bd.ibl_dfg_cc = float3(1, 1, 1);
}
float3 cc_f0_color = lerp(cc_f0, pbr.albedo.xyz, pbr.metallic);
- float3 cc_energy_comp = 1.0f + cc_f0_color * (1.0f / (cc_dfg.xxx + cc_dfg.yyy) - 1.0f);
+ float3 cc_energy_comp = 1.0f + cc_f0_color * (1.0f / (bd.ibl_dfg_cc.xxx + bd.ibl_dfg_cc.yyy) - 1.0f);
#endif
// Direct
@@ -115,23 +109,23 @@ float4 brdf(Pbr pbr, LightData data) {
float3 remainder = 1.0f;
#if defined(_CLEARCOAT)
- float Fcc = F_Schlick(data.direct.LoH, cc_f0, f90);
- float Dcc = D_GGX(pbr.cc_roughness, data.direct.NoH_cc);
- float Gcc = G_GGXSmith(pbr.cc_roughness, data.direct.NoL_cc, data.common.NoV_cc);
- float DFGcc = Fcc * Dcc * Gcc;
+ bd.direct_f_cc = F_Schlick(data.direct.LoH, cc_f0, f90);
+ bd.direct_d_cc = D_GGX(pbr.cc_roughness, data.direct.NoH_cc);
+ bd.direct_g_cc = G_GGXSmith(pbr.cc_roughness, data.direct.NoL_cc, data.common.NoV_cc);
+ float DFGcc = bd.direct_f_cc * bd.direct_d_cc * bd.direct_g_cc;
float3 direct_specular_cc = DFGcc * data.direct.color * data.direct.NoL_cc * pbr.cc_strength;
direct_specular_cc *= cc_energy_comp;
direct_specular_cc *= remainder;
direct_specular_cc = max(0, direct_specular_cc);
specular += direct_specular_cc;
- remainder *= saturate(1.0f - Fcc * pbr.cc_strength);
+ remainder *= saturate(1.0f - bd.direct_f_cc * pbr.cc_strength);
#endif
- float3 F = F_Schlick(data.direct.LoH, f0_color, f90);
- float D = D_GGX(pbr.roughness, data.direct.NoH);
- float G = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV);
+ bd.direct_f = F_Schlick(data.direct.LoH, f0_color, f90);
+ bd.direct_d = D_GGX(pbr.roughness, data.direct.NoH);
+ bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV);
- float3 direct_specular = (D * G) * F;
+ float3 direct_specular = (bd.direct_d * bd.direct_g) * bd.direct_f;
direct_specular *= data.direct.color * data.direct.NoL;
direct_specular *= energy_comp;
direct_specular *= remainder;
@@ -155,14 +149,14 @@ float4 brdf(Pbr pbr, LightData data) {
{
float3 remainder = 1.0f;
#if defined(_CLEARCOAT)
- float3 cc_specular_dfg = cc_dfg.xxx * cc_f0_color + cc_dfg.yyy; // filament 5.3.4.6
+ float3 cc_specular_dfg = bd.ibl_dfg_cc.xxx * cc_f0_color + bd.ibl_dfg_cc.yyy; // filament 5.3.4.6
float3 cc_indirect_specular = data.indirect.specular_cc * cc_specular_dfg;
cc_indirect_specular *= cc_energy_comp;
specular += cc_indirect_specular;
remainder -= cc_specular_dfg;
#endif
- float3 specular_dfg = dfg.xxx * f0_color + dfg.yyy; // filament 5.3.4.6
+ float3 specular_dfg = bd.ibl_dfg.xxx * f0_color + bd.ibl_dfg.yyy; // filament 5.3.4.6
float3 indirect_specular = data.indirect.specular * specular_dfg;
indirect_specular *= energy_comp;
diff --git a/data.cginc b/data.cginc
index 48087df..cbab2c7 100644
--- a/data.cginc
+++ b/data.cginc
@@ -87,4 +87,21 @@ struct LightData {
LightIndirect indirect;
};
+struct BrdfData {
+ float direct_d;
+ float3 direct_f;
+ float direct_g;
+
+#if defined(_CLEARCOAT)
+ float direct_d_cc;
+ float direct_f_cc;
+ float direct_g_cc;
+#endif
+
+ float3 ibl_dfg;
+#if defined(_CLEARCOAT)
+ float3 ibl_dfg_cc;
+#endif
+};
+
#endif // __DATA_INC
diff --git a/debug.cginc b/debug.cginc
new file mode 100644
index 0000000..2103a50
--- /dev/null
+++ b/debug.cginc
@@ -0,0 +1,62 @@
+#ifndef DEBUG_CGINC
+#define DEBUG_CGINC
+
+float4 apply_debug_view(v2f i, Pbr pbr, LightData light_data, BrdfData bd,
+ float4 color) {
+#if defined(_DEBUG_VIEW_UNLIT)
+ return pbr.albedo;
+#elif defined(_DEBUG_VIEW_WORLD_SPACE_NORMALS)
+ return float4((pbr.normal + 1.0f) * 0.5f, 1);
+#elif defined(_DEBUG_VIEW_OBJECT_SPACE_NORMALS)
+ float3 normalOS = normalize(mul((float3x3)unity_WorldToObject, pbr.normal));
+ return float4((normalOS + 1.0f) * 0.5f, 1);
+#elif defined(_DEBUG_VIEW_METALLIC_GLOSS)
+ return float4(pbr.metallic, pbr.smoothness, 0, 1);
+#elif defined(_DEBUG_VIEW_DEPTH)
+ float2 screen_uv = i.pos.xy / _ScreenParams.xy;
+ float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, screen_uv);
+ depth *= 100;
+ depth *= depth;
+ depth *= depth;
+ depth *= 100;
+ return float4(depth, depth, depth, 1);
+#elif defined(_DEBUG_VIEW_DIRECT_NOH)
+ return float4(F1_TO_F3(light_data.direct.NoH), 1);
+#elif defined(_DEBUG_VIEW_DIRECT_LOH)
+ return float4(F1_TO_F3(light_data.direct.LoH), 1);
+#elif defined(_DEBUG_VIEW_DIRECT_NOL)
+ return float4(F1_TO_F3(light_data.direct.NoL), 1);
+#elif defined(_DEBUG_VIEW_DIRECT_LOV)
+ return float4(F1_TO_F3(light_data.direct.LoV), 1);
+#elif defined(_DEBUG_VIEW_DIRECT_COLOR)
+ return float4(light_data.direct.color, 1);
+#elif defined(_DEBUG_VIEW_NOV)
+ return float4(F1_TO_F3(light_data.common.NoV), 1);
+#elif defined(_DEBUG_VIEW_AO)
+ return float4(F1_TO_F3(light_data.common.ao), 1);
+#elif defined(_DEBUG_VIEW_INDIRECT_DIFFUSE)
+ return float4(light_data.indirect.diffuse, 1);
+#elif defined(_DEBUG_VIEW_INDIRECT_SPECULAR)
+ return float4(light_data.indirect.specular, 1);
+#elif defined(_DEBUG_VIEW_BRDF_D)
+ return float4(F1_TO_F3(bd.direct_d), 1);
+#elif defined(_DEBUG_VIEW_BRDF_F)
+ return float4(bd.direct_f, 1);
+#elif defined(_DEBUG_VIEW_BRDF_G)
+ return float4(F1_TO_F3(bd.direct_g), 1);
+#elif defined(_DEBUG_VIEW_BRDF_DFG)
+ return float4(bd.ibl_dfg, 1);
+#elif defined(_DEBUG_VIEW_BRDF_D_CC)
+ return float4(F1_TO_F3(bd.direct_d_cc), 1);
+#elif defined(_DEBUG_VIEW_BRDF_F_CC)
+ return float4(F1_TO_F3(bd.direct_f_cc), 1);
+#elif defined(_DEBUG_VIEW_BRDF_G_CC)
+ return float4(F1_TO_F3(bd.direct_g_cc), 1);
+#elif defined(_DEBUG_VIEW_BRDF_DFG_CC)
+ return float4(bd.ibl_dfg_cc, 1);
+#else
+ return color;
+#endif
+}
+
+#endif // DEBUG_CGINC
diff --git a/features.cginc b/features.cginc
index 9a05eb2..9a9c8fd 100755
--- a/features.cginc
+++ b/features.cginc
@@ -74,25 +74,28 @@
#pragma shader_feature_local _VERTEX_DEFORMATION_TESSELLATION
//endex
-//ifex _Debug_View_Unlit==0
#pragma shader_feature_local _DEBUG_VIEW_UNLIT
-//endex
-
-//ifex _Debug_View_World_Space_Normals==0
#pragma shader_feature_local _DEBUG_VIEW_WORLD_SPACE_NORMALS
-//endex
-
-//ifex _Debug_View_Object_Space_Normals==0
#pragma shader_feature_local _DEBUG_VIEW_OBJECT_SPACE_NORMALS
-//endex
-
-//ifex _Debug_View_Metallic_Gloss==0
#pragma shader_feature_local _DEBUG_VIEW_METALLIC_GLOSS
-//endex
-
-//ifex _Debug_View_Depth==0
#pragma shader_feature_local _DEBUG_VIEW_DEPTH
-//endex
+#pragma shader_feature_local _DEBUG_VIEW_DIRECT_NOH
+#pragma shader_feature_local _DEBUG_VIEW_DIRECT_LOH
+#pragma shader_feature_local _DEBUG_VIEW_DIRECT_NOL
+#pragma shader_feature_local _DEBUG_VIEW_DIRECT_LOV
+#pragma shader_feature_local _DEBUG_VIEW_DIRECT_COLOR
+#pragma shader_feature_local _DEBUG_VIEW_NOV
+#pragma shader_feature_local _DEBUG_VIEW_AO
+#pragma shader_feature_local _DEBUG_VIEW_INDIRECT_DIFFUSE
+#pragma shader_feature_local _DEBUG_VIEW_INDIRECT_SPECULAR
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_D
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_F
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_G
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_DFG
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_D_CC
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_F_CC
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_G_CC
+#pragma shader_feature_local _DEBUG_VIEW_BRDF_DFG_CC
//ifex _Instance_Distance_Culling_Enabled==0
#pragma shader_feature_local _INSTANCE_DISTANCE_CULLING
diff --git a/math.cginc b/math.cginc
index 6b24a55..7c6db21 100755
--- a/math.cginc
+++ b/math.cginc
@@ -17,6 +17,8 @@
#define SQRT_3_OVER_2 0.8660254037844386f
#define EULERS_CONSTANT 2.718281828f
+#define F1_TO_F3(x) float3((x), (x), (x))
+
float sin_noise_3d(float3 uvw) {
return sin(uvw[0]) * sin(uvw[1]) * sin(uvw[2]);
}
diff --git a/pbr.cginc b/pbr.cginc
index f6000b8..f3c46a5 100755
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -180,8 +180,8 @@ void apply_kintsugi(float3 world_pos, inout float3 albedo, inout float smoothnes
Pbr getPbr(v2f i) {
Pbr pbr = (Pbr) 0;
- float3 n = normalize(i.normal);
- float3 t = normalize(i.tangent.xyz);
+ float3 n = i.normal;
+ float3 t = i.tangent.xyz;
t = normalize(t - n * dot(n, t)); // Gram-Schmidt to avoid skew
float3 b = normalize(cross(n, t)) * i.tangent.w;
pbr.tbn = float3x3(t, b, n);