summaryrefslogtreecommitdiffstats
path: root/tooner_lighting.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-08-10 13:41:58 -0700
committeryum <yum.food.vr@gmail.com>2024-08-10 13:41:58 -0700
commit8948b000fb82cea4ce1d966a669daf68bfeb3166 (patch)
treec607bcd235dd2abf58a0eb2986d089027d5aff22 /tooner_lighting.cginc
parent9035231332e55f9995618f3b65ab8b05d9b52023 (diff)
Implement metallics in PBR overlay
Diffstat (limited to 'tooner_lighting.cginc')
-rw-r--r--tooner_lighting.cginc87
1 files changed, 74 insertions, 13 deletions
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index a48d823..1100809 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -555,6 +555,9 @@ struct PbrOverlay {
#if defined(_PBR_OVERLAY0_ROUGHNESS)
float ov0_roughness;
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+ float ov0_metallic;
+#endif
float ov0_mask;
#endif
#if defined(_PBR_OVERLAY1)
@@ -562,6 +565,9 @@ struct PbrOverlay {
#if defined(_PBR_OVERLAY1_ROUGHNESS)
float ov1_roughness;
#endif
+#if defined(_PBR_OVERLAY1_METALLIC)
+ float ov1_metallic;
+#endif
float ov1_mask;
#endif
#if defined(_PBR_OVERLAY2)
@@ -569,6 +575,9 @@ struct PbrOverlay {
#if defined(_PBR_OVERLAY2_ROUGHNESS)
float ov2_roughness;
#endif
+#if defined(_PBR_OVERLAY2_METALLIC)
+ float ov2_metallic;
+#endif
float ov2_mask;
#endif
#if defined(_PBR_OVERLAY3)
@@ -576,11 +585,14 @@ struct PbrOverlay {
#if defined(_PBR_OVERLAY3_ROUGHNESS)
float ov3_roughness;
#endif
+#if defined(_PBR_OVERLAY3_METALLIC)
+ float ov3_metallic;
+#endif
float ov3_mask;
#endif
};
-void getOverlayAlbedoRoughness(inout PbrOverlay ov,
+void getOverlayAlbedoRoughnessMetallic(inout PbrOverlay ov,
v2f i, float iddx, float iddy)
{
#if defined(_PBR_OVERLAY0)
@@ -600,6 +612,15 @@ void getOverlayAlbedoRoughness(inout PbrOverlay ov,
#endif // _PBR_OVERLAY0_ROUGHNESS_MAP
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+#if defined(_PBR_OVERLAY0_METALLIC_MAP)
+ ov.ov0_metallic = _PBR_Overlay0_MetallicTex.SampleGrad(GET_SAMPLER_OV0, UV_SCOFF(i, _PBR_Overlay0_MetallicTex_ST, _PBR_Overlay0_UV_Select), iddx * _PBR_Overlay0_MetallicTex_ST.x, iddy * _PBR_Overlay0_MetallicTex_ST.y);
+ ov.ov0_metallic *= _PBR_Overlay0_Metallic;
+#else
+ ov.ov0_metallic = _PBR_Overlay0_Metallic;
+#endif // _PBR_OVERLAY0_METALLIC_MAP
+#endif
+
#if defined(_PBR_OVERLAY0_MASK)
ov.ov0_mask = _PBR_Overlay0_Mask.SampleGrad(GET_SAMPLER_OV0, i.uv0, iddx, iddy);
ov.ov0_mask = ((bool) round(_PBR_Overlay0_Mask_Invert)) ? 1.0 - ov.ov0_mask : ov.ov0_mask;
@@ -619,13 +640,22 @@ void getOverlayAlbedoRoughness(inout PbrOverlay ov,
#if defined(_PBR_OVERLAY1_ROUGHNESS)
#if defined(_PBR_OVERLAY1_ROUGHNESS_MAP)
- ov.ov0_roughness = _PBR_Overlay1_RoughnessTex.SampleGrad(GET_SAMPLER_OV1, UV_SCOFF(i, _PBR_Overlay1_RoughnessTex_ST, _PBR_Overlay1_UV_Select), iddx * _PBR_Overlay1_RoughnessTex_ST.x, iddy * _PBR_Overlay1_RoughnessTex_ST.y);
- ov.ov0_roughness *= _PBR_Overlay1_Roughness;
+ ov.ov1_roughness = _PBR_Overlay1_RoughnessTex.SampleGrad(GET_SAMPLER_OV1, UV_SCOFF(i, _PBR_Overlay1_RoughnessTex_ST, _PBR_Overlay1_UV_Select), iddx * _PBR_Overlay1_RoughnessTex_ST.x, iddy * _PBR_Overlay1_RoughnessTex_ST.y);
+ ov.ov1_roughness *= _PBR_Overlay1_Roughness;
#else
- ov.ov0_roughness = _PBR_Overlay1_Roughness;
+ ov.ov1_roughness = _PBR_Overlay1_Roughness;
#endif // _PBR_OVERLAY1_ROUGHNESS_MAP
#endif
+#if defined(_PBR_OVERLAY1_METALLIC)
+#if defined(_PBR_OVERLAY1_METALLIC_MAP)
+ ov.ov1_metallic = _PBR_Overlay1_MetallicTex.SampleGrad(GET_SAMPLER_OV1, UV_SCOFF(i, _PBR_Overlay1_MetallicTex_ST, _PBR_Overlay1_UV_Select), iddx * _PBR_Overlay1_MetallicTex_ST.x, iddy * _PBR_Overlay1_MetallicTex_ST.y);
+ ov.ov1_metallic *= _PBR_Overlay1_Metallic;
+#else
+ ov.ov1_metallic = _PBR_Overlay1_Metallic;
+#endif // _PBR_OVERLAY1_METALLIC_MAP
+#endif
+
#if defined(_PBR_OVERLAY1_MASK)
ov.ov1_mask = _PBR_Overlay1_Mask.SampleGrad(GET_SAMPLER_OV1, i.uv0, iddx, iddy);
ov.ov1_mask = ((bool) round(_PBR_Overlay1_Mask_Invert)) ? 1.0 - ov.ov1_mask : ov.ov1_mask;
@@ -645,13 +675,22 @@ void getOverlayAlbedoRoughness(inout PbrOverlay ov,
#if defined(_PBR_OVERLAY2_ROUGHNESS)
#if defined(_PBR_OVERLAY2_ROUGHNESS_MAP)
- ov.ov0_roughness = _PBR_Overlay2_RoughnessTex.SampleGrad(GET_SAMPLER_OV2, UV_SCOFF(i, _PBR_Overlay2_RoughnessTex_ST, _PBR_Overlay2_UV_Select), iddx * _PBR_Overlay2_RoughnessTex_ST.x, iddy * _PBR_Overlay2_RoughnessTex_ST.y);
- ov.ov0_roughness *= _PBR_Overlay2_Roughness;
+ ov.ov2_roughness = _PBR_Overlay2_RoughnessTex.SampleGrad(GET_SAMPLER_OV2, UV_SCOFF(i, _PBR_Overlay2_RoughnessTex_ST, _PBR_Overlay2_UV_Select), iddx * _PBR_Overlay2_RoughnessTex_ST.x, iddy * _PBR_Overlay2_RoughnessTex_ST.y);
+ ov.ov2_roughness *= _PBR_Overlay2_Roughness;
#else
- ov.ov0_roughness = _PBR_Overlay2_Roughness;
+ ov.ov2_roughness = _PBR_Overlay2_Roughness;
#endif // _PBR_OVERLAY2_ROUGHNESS_MAP
#endif
+#if defined(_PBR_OVERLAY2_METALLIC)
+#if defined(_PBR_OVERLAY2_METALLIC_MAP)
+ ov.ov2_metallic = _PBR_Overlay2_MetallicTex.SampleGrad(GET_SAMPLER_OV2, UV_SCOFF(i, _PBR_Overlay2_MetallicTex_ST, _PBR_Overlay2_UV_Select), iddx * _PBR_Overlay2_MetallicTex_ST.x, iddy * _PBR_Overlay2_MetallicTex_ST.y);
+ ov.ov2_metallic *= _PBR_Overlay2_Metallic;
+#else
+ ov.ov2_metallic = _PBR_Overlay2_Metallic;
+#endif // _PBR_OVERLAY2_METALLIC_MAP
+#endif
+
#if defined(_PBR_OVERLAY2_MASK)
ov.ov2_mask = _PBR_Overlay2_Mask.SampleGrad(GET_SAMPLER_OV2, i.uv0, iddx, iddy);
ov.ov2_mask = ((bool) round(_PBR_Overlay2_Mask_Invert)) ? 1.0 - ov.ov2_mask : ov.ov2_mask;
@@ -671,13 +710,22 @@ void getOverlayAlbedoRoughness(inout PbrOverlay ov,
#if defined(_PBR_OVERLAY3_ROUGHNESS)
#if defined(_PBR_OVERLAY3_ROUGHNESS_MAP)
- ov.ov0_roughness = _PBR_Overlay3_RoughnessTex.SampleGrad(GET_SAMPLER_OV3, UV_SCOFF(i, _PBR_Overlay3_RoughnessTex_ST, _PBR_Overlay3_UV_Select), iddx * _PBR_Overlay3_RoughnessTex_ST.x, iddy * _PBR_Overlay3_RoughnessTex_ST.y);
- ov.ov0_roughness *= _PBR_Overlay3_Roughness;
+ ov.ov3_roughness = _PBR_Overlay3_RoughnessTex.SampleGrad(GET_SAMPLER_OV3, UV_SCOFF(i, _PBR_Overlay3_RoughnessTex_ST, _PBR_Overlay3_UV_Select), iddx * _PBR_Overlay3_RoughnessTex_ST.x, iddy * _PBR_Overlay3_RoughnessTex_ST.y);
+ ov.ov3_roughness *= _PBR_Overlay3_Roughness;
#else
- ov.ov0_roughness = _PBR_Overlay3_Roughness;
+ ov.ov3_roughness = _PBR_Overlay3_Roughness;
#endif // _PBR_OVERLAY3_ROUGHNESS_MAP
#endif
+#if defined(_PBR_OVERLAY3_METALLIC)
+#if defined(_PBR_OVERLAY3_METALLIC_MAP)
+ ov.ov3_metallic = _PBR_Overlay3_MetallicTex.SampleGrad(GET_SAMPLER_OV3, UV_SCOFF(i, _PBR_Overlay3_MetallicTex_ST, _PBR_Overlay3_UV_Select), iddx * _PBR_Overlay3_MetallicTex_ST.x, iddy * _PBR_Overlay3_MetallicTex_ST.y);
+ ov.ov3_metallic *= _PBR_Overlay3_Metallic;
+#else
+ ov.ov3_metallic = _PBR_Overlay3_Metallic;
+#endif // _PBR_OVERLAY3_METALLIC_MAP
+#endif
+
#if defined(_PBR_OVERLAY3_MASK)
ov.ov3_mask = _PBR_Overlay3_Mask.SampleGrad(GET_SAMPLER_OV3, i.uv0, iddx, iddy);
ov.ov3_mask = ((bool) round(_PBR_Overlay3_Mask_Invert)) ? 1.0 - ov.ov3_mask : ov.ov3_mask;
@@ -844,7 +892,8 @@ void applyDecal(inout float4 albedo,
#endif // _DECAL3
}
-void mixOverlayAlbedoRoughness(inout float4 albedo, inout float roughness, PbrOverlay ov) {
+void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo,
+ inout float roughness, inout float metallic, PbrOverlay ov) {
// Calculate alpha masks before we start mutating alpha.
#if defined(_PBR_OVERLAY0)
float a0 = saturate(ov.ov0_albedo.a * _PBR_Overlay0_Alpha_Multiplier);
@@ -885,6 +934,9 @@ void mixOverlayAlbedoRoughness(inout float4 albedo, inout float roughness, PbrOv
#if defined(_PBR_OVERLAY0_ROUGHNESS)
roughness = lerp(roughness, ov.ov0_roughness, a0);
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+ metallic = lerp(metallic, ov.ov0_metallic, a0);
+#endif
albedo.a = max(albedo.a, a0);
#elif defined(_PBR_OVERLAY0_MIX_ADD)
albedo.rgb += ov.ov0_albedo;
@@ -901,6 +953,9 @@ void mixOverlayAlbedoRoughness(inout float4 albedo, inout float roughness, PbrOv
#if defined(_PBR_OVERLAY0_ROUGHNESS)
roughness = lerp(roughness, ov.ov1_roughness, a1);
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+ metallic = lerp(metallic, ov.ov1_metallic, a1);
+#endif
albedo.a = max(albedo.a, a1);
#elif defined(_PBR_OVERLAY1_MIX_ADD)
albedo.rgb += ov.ov1_albedo;
@@ -917,6 +972,9 @@ void mixOverlayAlbedoRoughness(inout float4 albedo, inout float roughness, PbrOv
#if defined(_PBR_OVERLAY0_ROUGHNESS)
roughness = lerp(roughness, ov.ov2_roughness, a2);
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+ metallic = lerp(metallic, ov.ov2_metallic, a2);
+#endif
albedo.a = max(albedo.a, a2);
#elif defined(_PBR_OVERLAY2_MIX_ADD)
albedo.rgb += ov.ov2_albedo;
@@ -933,6 +991,9 @@ void mixOverlayAlbedoRoughness(inout float4 albedo, inout float roughness, PbrOv
#if defined(_PBR_OVERLAY0_ROUGHNESS)
roughness = lerp(roughness, ov.ov3_roughness, a3);
#endif
+#if defined(_PBR_OVERLAY0_METALLIC)
+ metallic = lerp(metallic, ov.ov3_metallic, a3);
+#endif
albedo.a = max(albedo.a, a3);
#elif defined(_PBR_OVERLAY3_MIX_ADD)
albedo.rgb += ov.ov3_albedo;
@@ -1139,7 +1200,7 @@ float4 effect(inout v2f i)
#endif
PbrOverlay ov;
- getOverlayAlbedoRoughness(ov, i, iddx, iddy);
+ getOverlayAlbedoRoughnessMetallic(ov, i, iddx, iddy);
#if defined(_NORMAL_MAP)
// Use UVs to smoothly blend between fully detailed normals when close up and
@@ -1345,7 +1406,7 @@ float4 effect(inout v2f i)
}
#endif // _MATCAP0 || _MATCAP1
- mixOverlayAlbedoRoughness(albedo, roughness, ov);
+ mixOverlayAlbedoRoughnessMetallic(albedo, roughness, metallic, ov);
#if defined(_DECAL0) || defined(_DECAL1) || defined(_DECAL2) || defined(_DECAL3)
float3 decal_emission = 0;
applyDecal(albedo, roughness, metallic, decal_emission, i);