diff options
| author | yum <yum.food.vr@gmail.com> | 2025-01-19 13:25:52 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-01-19 13:25:52 -0800 |
| commit | ffc4bb2c80582cd81aa801bff9c274d833076ae6 (patch) | |
| tree | f733af8b33b4c980386d2a3f2d533b8ce8611403 /pbr_overlay.cginc | |
| parent | bee103e89fc83030bfc0251db5a78bb153042e1f (diff) | |
Add terrain gimmick (ds2_11) and analytic fog (fog01)
Diffstat (limited to 'pbr_overlay.cginc')
| -rw-r--r-- | pbr_overlay.cginc | 464 |
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 + |
