diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-16 15:51:20 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-16 15:51:29 -0700 |
| commit | 7bfc0ecde84604abf8974ec2ffd1e9b0efb84bea (patch) | |
| tree | 4473487cb2d9b06b8cd675bf363f84167684e1ca | |
| parent | 50fcd18a2fb21cb19893c0c65310a525925c9177 (diff) | |
Add more debug views
| -rwxr-xr-x | 3ner.cginc | 29 | ||||
| -rwxr-xr-x | 3ner.shader | 17 | ||||
| -rwxr-xr-x | brdf.cginc | 44 | ||||
| -rw-r--r-- | data.cginc | 17 | ||||
| -rw-r--r-- | debug.cginc | 62 | ||||
| -rwxr-xr-x | features.cginc | 31 | ||||
| -rwxr-xr-x | math.cginc | 2 | ||||
| -rwxr-xr-x | pbr.cginc | 4 |
8 files changed, 141 insertions, 65 deletions
@@ -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 @@ -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; @@ -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 @@ -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]); } @@ -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); |
