summaryrefslogtreecommitdiffstats
path: root/pbr_overlay.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-01-19 13:25:52 -0800
committeryum <yum.food.vr@gmail.com>2025-01-19 13:25:52 -0800
commitffc4bb2c80582cd81aa801bff9c274d833076ae6 (patch)
treef733af8b33b4c980386d2a3f2d533b8ce8611403 /pbr_overlay.cginc
parentbee103e89fc83030bfc0251db5a78bb153042e1f (diff)
Add terrain gimmick (ds2_11) and analytic fog (fog01)
Diffstat (limited to 'pbr_overlay.cginc')
-rw-r--r--pbr_overlay.cginc464
1 files changed, 464 insertions, 0 deletions
diff --git a/pbr_overlay.cginc b/pbr_overlay.cginc
new file mode 100644
index 0000000..2ebbb10
--- /dev/null
+++ b/pbr_overlay.cginc
@@ -0,0 +1,464 @@
+#include "texture_macros.cginc"
+#include "UnityStandardUtils.cginc"
+
+#ifndef __PBR_OVERLAY_INC
+#define __PBR_OVERLAY_INC
+
+struct PbrOverlay {
+#if defined(_PBR_OVERLAY0)
+ float4 ov0_albedo;
+#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)
+ float4 ov1_albedo;
+#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)
+ float4 ov2_albedo;
+#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)
+ float4 ov3_albedo;
+#if defined(_PBR_OVERLAY3_ROUGHNESS)
+ float ov3_roughness;
+#endif
+#if defined(_PBR_OVERLAY3_METALLIC)
+ float ov3_metallic;
+#endif
+ float ov3_mask;
+#endif
+};
+
+void getOverlayAlbedoRoughnessMetallic(inout PbrOverlay ov,
+ v2f i)
+{
+#if defined(_PBR_OVERLAY0)
+#if defined(_PBR_OVERLAY0_BASECOLOR_MAP)
+ ov.ov0_albedo = _PBR_Overlay0_BaseColorTex.SampleBias(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_BaseColorTex_ST, _PBR_Overlay0_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias);
+ ov.ov0_albedo *= _PBR_Overlay0_BaseColor;
+#else
+ ov.ov0_albedo = _PBR_Overlay0_BaseColor;
+#endif // _PBR_OVERLAY0_BASECOLOR_MAP
+
+#if defined(_PBR_OVERLAY0_ROUGHNESS)
+#if defined(_PBR_OVERLAY0_ROUGHNESS_MAP)
+ ov.ov0_roughness = _PBR_Overlay0_RoughnessTex.SampleBias(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_RoughnessTex_ST, _PBR_Overlay0_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias);
+ ov.ov0_roughness *= _PBR_Overlay0_Roughness;
+#else
+ ov.ov0_roughness = _PBR_Overlay0_Roughness;
+#endif // _PBR_OVERLAY0_ROUGHNESS_MAP
+#endif
+
+#if defined(_PBR_OVERLAY0_METALLIC)
+#if defined(_PBR_OVERLAY0_METALLIC_MAP)
+ ov.ov0_metallic = _PBR_Overlay0_MetallicTex.SampleBias(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_MetallicTex_ST, _PBR_Overlay0_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias);
+ 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.SampleLevel(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_Mask_ST, _PBR_Overlay0_UV_Select),
+ get_uv_by_channel(i, _PBR_Overlay0_UV_Select), 0);
+ ov.ov0_mask = ((bool) round(_PBR_Overlay0_Mask_Invert)) ? 1.0 - ov.ov0_mask : ov.ov0_mask;
+#else
+ ov.ov0_mask = 1;
+#endif
+ ov.ov0_albedo.a *= ov.ov0_mask;
+#endif // _PBR_OVERLAY0
+
+#if defined(_PBR_OVERLAY1)
+#if defined(_PBR_OVERLAY1_BASECOLOR_MAP)
+ ov.ov1_albedo = _PBR_Overlay1_BaseColorTex.SampleBias(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_BaseColorTex_ST, _PBR_Overlay1_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias);
+ ov.ov1_albedo *= _PBR_Overlay1_BaseColor;
+#else
+ ov.ov1_albedo = _PBR_Overlay1_BaseColor;
+#endif // _PBR_OVERLAY1_BASECOLOR_MAP
+
+#if defined(_PBR_OVERLAY1_ROUGHNESS)
+#if defined(_PBR_OVERLAY1_ROUGHNESS_MAP)
+ ov.ov1_roughness = _PBR_Overlay1_RoughnessTex.SampleBias(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_RoughnessTex_ST, _PBR_Overlay1_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias);
+ ov.ov1_roughness *= _PBR_Overlay1_Roughness;
+#else
+ 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.SampleBias(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_MetallicTex_ST, _PBR_Overlay1_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias);
+ 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.SampleLevel(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_Mask_ST, _PBR_Overlay1_UV_Select), 0);
+ ov.ov1_mask = ((bool) round(_PBR_Overlay1_Mask_Invert)) ? 1.0 - ov.ov1_mask : ov.ov1_mask;
+#else
+ ov.ov1_mask = 1;
+#endif
+ ov.ov1_albedo.a *= ov.ov1_mask;
+#endif // _PBR_OVERLAY1
+
+#if defined(_PBR_OVERLAY2)
+#if defined(_PBR_OVERLAY2_BASECOLOR_MAP)
+ ov.ov2_albedo = _PBR_Overlay2_BaseColorTex.SampleBias(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_BaseColorTex_ST, _PBR_Overlay2_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias);
+ ov.ov2_albedo *= _PBR_Overlay2_BaseColor;
+#else
+ ov.ov2_albedo = _PBR_Overlay2_BaseColor;
+#endif // _PBR_OVERLAY2_BASECOLOR_MAP
+
+#if defined(_PBR_OVERLAY2_ROUGHNESS)
+#if defined(_PBR_OVERLAY2_ROUGHNESS_MAP)
+ ov.ov2_roughness = _PBR_Overlay2_RoughnessTex.SampleBias(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_RoughnessTex_ST, _PBR_Overlay2_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias);
+ ov.ov2_roughness *= _PBR_Overlay2_Roughness;
+#else
+ 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.SampleBias(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_MetallicTex_ST, _PBR_Overlay2_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias);
+ 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.SampleLevel(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_Mask_ST, _PBR_Overlay2_UV_Select), 0);
+ ov.ov2_mask = ((bool) round(_PBR_Overlay2_Mask_Invert)) ? 1.0 - ov.ov2_mask : ov.ov2_mask;
+#else
+ ov.ov2_mask = 1;
+#endif
+ ov.ov2_albedo.a *= ov.ov2_mask;
+#endif // _PBR_OVERLAY2
+
+#if defined(_PBR_OVERLAY3)
+#if defined(_PBR_OVERLAY3_BASECOLOR_MAP)
+ ov.ov3_albedo = _PBR_Overlay3_BaseColorTex.SampleBias(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_BaseColorTex_ST, _PBR_Overlay3_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias);
+ ov.ov3_albedo *= _PBR_Overlay3_BaseColor;
+#else
+ ov.ov3_albedo = _PBR_Overlay3_BaseColor;
+#endif // _PBR_OVERLAY3_BASECOLOR_MAP
+
+#if defined(_PBR_OVERLAY3_ROUGHNESS)
+#if defined(_PBR_OVERLAY3_ROUGHNESS_MAP)
+ ov.ov3_roughness = _PBR_Overlay3_RoughnessTex.SampleBias(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_RoughnessTex_ST, _PBR_Overlay3_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias);
+ ov.ov3_roughness *= _PBR_Overlay3_Roughness;
+#else
+ 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.SampleBias(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_MetallicTex_ST, _PBR_Overlay3_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias);
+ 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.SampleLevel(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_Mask_ST, _PBR_Overlay3_UV_Select), 0);
+ ov.ov3_mask = ((bool) round(_PBR_Overlay3_Mask_Invert)) ? 1.0 - ov.ov3_mask : ov.ov3_mask;
+#else
+ ov.ov3_mask = 1;
+#endif
+ ov.ov3_albedo.a *= ov.ov3_mask;
+#endif // _PBR_OVERLAY3
+}
+
+void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo,
+ inout float roughness, inout float metallic, PbrOverlay ov,
+ float mask, out float glitter_mask) {
+ glitter_mask = 1;
+ // Calculate alpha masks before we start mutating alpha.
+#if defined(_PBR_OVERLAY0)
+ float a0 = saturate(ov.ov0_albedo.a * _PBR_Overlay0_Alpha_Multiplier);
+ if (_PBR_Overlay0_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay0_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay0_Constrain_By_Alpha_Max);
+ a0 *= in_range;
+ }
+ a0 *= mask;
+ a0 *= ov.ov0_mask;
+ glitter_mask *= 1 - a0 * _PBR_Overlay0_Mask_Glitter;
+#endif
+#if defined(_PBR_OVERLAY1)
+ float a1 = saturate(ov.ov1_albedo.a * _PBR_Overlay1_Alpha_Multiplier);
+ if (_PBR_Overlay1_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay1_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay1_Constrain_By_Alpha_Max);
+ a1 *= in_range;
+ }
+ a1 *= mask;
+ a1 *= ov.ov1_mask;
+ glitter_mask *= 1 - a1 * _PBR_Overlay1_Mask_Glitter;
+#endif
+#if defined(_PBR_OVERLAY2)
+ float a2 = saturate(ov.ov2_albedo.a * _PBR_Overlay2_Alpha_Multiplier);
+ if (_PBR_Overlay2_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay2_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay2_Constrain_By_Alpha_Max);
+ a2 *= in_range;
+ }
+ a2 *= mask;
+ a2 *= ov.ov2_mask;
+ glitter_mask *= 1 - a2 * _PBR_Overlay2_Mask_Glitter;
+#endif
+#if defined(_PBR_OVERLAY3)
+ float a3 = saturate(ov.ov3_albedo.a * _PBR_Overlay3_Alpha_Multiplier);
+ if (_PBR_Overlay3_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay3_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay3_Constrain_By_Alpha_Max);
+ a3 *= in_range;
+ }
+ a3 *= mask;
+ a3 *= ov.ov3_mask;
+ glitter_mask *= 1 - a3 * _PBR_Overlay3_Mask_Glitter;
+#endif
+
+#if defined(_PBR_OVERLAY0)
+#if defined(_PBR_OVERLAY0_MIX_ALPHA_BLEND)
+ albedo.rgb = lerp(albedo.rgb, ov.ov0_albedo.rgb, a0);
+#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 * mask * ov.ov0_mask;
+#elif defined(_PBR_OVERLAY0_MIX_MIN)
+ albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov0_albedo), mask * ov.ov0_mask);
+#elif defined(_PBR_OVERLAY0_MIX_MAX)
+ albedo.rgb = max(albedo.rgb, ov.ov0_albedo * mask * ov.ov0_mask);
+#elif defined(_PBR_OVERLAY0_MIX_MULTIPLY)
+ albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov0_albedo, mask * ov.ov0_mask);
+#endif
+#endif
+
+#if defined(_PBR_OVERLAY1)
+#if defined(_PBR_OVERLAY1_MIX_ALPHA_BLEND)
+ albedo.rgb = lerp(albedo.rgb, ov.ov1_albedo.rgb, a1);
+#if defined(_PBR_OVERLAY1_ROUGHNESS)
+ roughness = lerp(roughness, ov.ov1_roughness, a1);
+#endif
+#if defined(_PBR_OVERLAY1_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 * mask * ov.ov1_mask;
+#elif defined(_PBR_OVERLAY1_MIX_MIN)
+ albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov1_albedo), mask * ov.ov1_mask);
+#elif defined(_PBR_OVERLAY1_MIX_MAX)
+ albedo.rgb = max(albedo.rgb, ov.ov1_albedo * mask * ov.ov1_mask);
+#elif defined(_PBR_OVERLAY1_MIX_MULTIPLY)
+ albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov1_albedo, mask * ov.ov1_mask);
+#endif
+#endif
+
+#if defined(_PBR_OVERLAY2)
+#if defined(_PBR_OVERLAY2_MIX_ALPHA_BLEND)
+ albedo.rgb = lerp(albedo.rgb, ov.ov2_albedo.rgb, a2);
+#if defined(_PBR_OVERLAY2_ROUGHNESS)
+ roughness = lerp(roughness, ov.ov2_roughness, a2);
+#endif
+#if defined(_PBR_OVERLAY2_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 * mask * ov.ov2_mask;
+#elif defined(_PBR_OVERLAY2_MIX_MIN)
+ albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov2_albedo), mask * ov.ov2_mask);
+#elif defined(_PBR_OVERLAY2_MIX_MAX)
+ albedo.rgb = max(albedo.rgb, ov.ov2_albedo * mask * ov.ov2_mask);
+#elif defined(_PBR_OVERLAY2_MIX_MULTIPLY)
+ albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov2_albedo, mask * ov.ov2_mask);
+#endif
+#endif
+
+#if defined(_PBR_OVERLAY3)
+#if defined(_PBR_OVERLAY3_MIX_ALPHA_BLEND)
+ albedo.rgb = lerp(albedo.rgb, ov.ov3_albedo.rgb, a3);
+#if defined(_PBR_OVERLAY3_ROUGHNESS)
+ roughness = lerp(roughness, ov.ov3_roughness, a3);
+#endif
+#if defined(_PBR_OVERLAY3_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 * mask * ov.ov3_mask;
+#elif defined(_PBR_OVERLAY3_MIX_MIN)
+ albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov3_albedo), mask * ov.ov3_mask);
+#elif defined(_PBR_OVERLAY3_MIX_MAX)
+ albedo.rgb = max(albedo.rgb, ov.ov3_albedo * mask * ov.ov3_mask);
+#elif defined(_PBR_OVERLAY3_MIX_MULTIPLY)
+ albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov3_albedo, mask * ov.ov3_mask);
+#endif
+#endif
+}
+
+void applyOverlayNormal(inout float3 raw_normal, float4 albedo, PbrOverlay ov, v2f i)
+{
+ float3 raw_normal_2;
+#if defined(_PBR_OVERLAY0) && defined(_PBR_OVERLAY0_NORMAL_MAP)
+ float a0 = 1;
+ if (_PBR_Overlay0_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay0_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay0_Constrain_By_Alpha_Max);
+ a0 *= in_range;
+ }
+ // Use UVs to smoothly blend between fully detailed normals when close up and
+ // flat normals when far away. If we don't do this, then we see moire effects
+ // on e.g. striped normal maps.
+ raw_normal_2 = UnpackScaleNormal(_PBR_Overlay0_NormalTex.SampleBias(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_NormalTex_ST, _PBR_Overlay0_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias),
+ _PBR_Overlay0_Tex_NormalStr * ov.ov0_mask * a0);
+
+ raw_normal = BlendNormals(
+ raw_normal,
+ raw_normal_2);
+#endif // _PBR_OVERLAY0 && _PBR_OVERLAY0_NORMAL_MAP
+#if defined(_PBR_OVERLAY1) && defined(_PBR_OVERLAY1_NORMAL_MAP)
+ float a1 = 1;
+ if (_PBR_Overlay1_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay1_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay1_Constrain_By_Alpha_Max);
+ a1 *= in_range;
+ }
+ raw_normal_2 = UnpackScaleNormal(_PBR_Overlay1_NormalTex.SampleBias(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_NormalTex_ST, _PBR_Overlay1_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias),
+ _PBR_Overlay1_Tex_NormalStr * ov.ov1_mask * a1);
+
+ raw_normal = BlendNormals(
+ raw_normal,
+ raw_normal_2);
+#endif // _PBR_OVERLAY1 && _PBR_OVERLAY1_NORMAL_MAP
+#if defined(_PBR_OVERLAY2) && defined(_PBR_OVERLAY2_NORMAL_MAP)
+ float a2 = 1;
+ if (_PBR_Overlay2_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay2_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay2_Constrain_By_Alpha_Max);
+ a2 *= in_range;
+ }
+ raw_normal_2 = UnpackScaleNormal(_PBR_Overlay2_NormalTex.SampleBias(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_NormalTex_ST, _PBR_Overlay2_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias),
+ _PBR_Overlay2_Tex_NormalStr * ov.ov2_mask * a2);
+
+ raw_normal = BlendNormals(
+ raw_normal,
+ raw_normal_2);
+#endif // _PBR_OVERLAY2 && _PBR_OVERLAY2_NORMAL_MAP
+#if defined(_PBR_OVERLAY3) && defined(_PBR_OVERLAY3_NORMAL_MAP)
+ float a3 = 1;
+ if (_PBR_Overlay3_Constrain_By_Alpha) {
+ bool in_range = (albedo.a > _PBR_Overlay3_Constrain_By_Alpha_Min) *
+ (albedo.a < _PBR_Overlay3_Constrain_By_Alpha_Max);
+ a3 *= in_range;
+ }
+ raw_normal_2 = UnpackScaleNormal(_PBR_Overlay3_NormalTex.SampleBias(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_NormalTex_ST, _PBR_Overlay3_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias),
+ _PBR_Overlay3_Tex_NormalStr * ov.ov3_mask * a3);
+
+ raw_normal = BlendNormals(
+ raw_normal,
+ raw_normal_2);
+#endif // _PBR_OVERLAY3 && _PBR_OVERLAY3_NORMAL_MAP
+}
+
+float3 getOverlayEmission(PbrOverlay ov, v2f i)
+{
+ float3 em = 0;
+#if defined(_PBR_OVERLAY0_EMISSION_MAP)
+ em += _PBR_Overlay0_EmissionTex.SampleBias(GET_SAMPLER_OV0,
+ UV_SCOFF(i, _PBR_Overlay0_EmissionTex_ST, _PBR_Overlay0_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias) *
+ _PBR_Overlay0_Emission * ov.ov0_mask;
+#endif
+
+#if defined(_PBR_OVERLAY1_EMISSION_MAP)
+ em += _PBR_Overlay1_EmissionTex.SampleBias(GET_SAMPLER_OV1,
+ UV_SCOFF(i, _PBR_Overlay1_EmissionTex_ST, _PBR_Overlay1_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias) *
+ _PBR_Overlay1_Emission * ov.ov1_mask;
+#endif
+
+#if defined(_PBR_OVERLAY2_EMISSION_MAP)
+ em += _PBR_Overlay2_EmissionTex.SampleBias(GET_SAMPLER_OV2,
+ UV_SCOFF(i, _PBR_Overlay2_EmissionTex_ST, _PBR_Overlay2_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias) *
+ _PBR_Overlay2_Emission * ov.ov2_mask;
+#endif
+
+#if defined(_PBR_OVERLAY3_EMISSION_MAP)
+ em += _PBR_Overlay3_EmissionTex.SampleBias(GET_SAMPLER_OV3,
+ UV_SCOFF(i, _PBR_Overlay3_EmissionTex_ST, _PBR_Overlay3_UV_Select),
+ _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias) *
+ _PBR_Overlay3_Emission * ov.ov3_mask;
+#endif
+ return em;
+}
+
+#endif // __PBR_OVERLAY_INC
+