yum-archive/Tooner
A toon shader for Unity's BIRP.
git clone https://git.yummers.dev/yum-archive/Tooner
ffc4bb2
master
1#include "texture_macros.cginc" 2#include "UnityStandardUtils.cginc" 3 4#ifndef __PBR_OVERLAY_INC 5#define __PBR_OVERLAY_INC 6 7struct PbrOverlay { 8#if defined(_PBR_OVERLAY0) 9 float4 ov0_albedo; 10#if defined(_PBR_OVERLAY0_ROUGHNESS) 11 float ov0_roughness; 12#endif 13#if defined(_PBR_OVERLAY0_METALLIC) 14 float ov0_metallic; 15#endif 16 float ov0_mask; 17#endif 18#if defined(_PBR_OVERLAY1) 19 float4 ov1_albedo; 20#if defined(_PBR_OVERLAY1_ROUGHNESS) 21 float ov1_roughness; 22#endif 23#if defined(_PBR_OVERLAY1_METALLIC) 24 float ov1_metallic; 25#endif 26 float ov1_mask; 27#endif 28#if defined(_PBR_OVERLAY2) 29 float4 ov2_albedo; 30#if defined(_PBR_OVERLAY2_ROUGHNESS) 31 float ov2_roughness; 32#endif 33#if defined(_PBR_OVERLAY2_METALLIC) 34 float ov2_metallic; 35#endif 36 float ov2_mask; 37#endif 38#if defined(_PBR_OVERLAY3) 39 float4 ov3_albedo; 40#if defined(_PBR_OVERLAY3_ROUGHNESS) 41 float ov3_roughness; 42#endif 43#if defined(_PBR_OVERLAY3_METALLIC) 44 float ov3_metallic; 45#endif 46 float ov3_mask; 47#endif 48}; 49 50void getOverlayAlbedoRoughnessMetallic(inout PbrOverlay ov, 51 v2f i) 52{ 53#if defined(_PBR_OVERLAY0) 54#if defined(_PBR_OVERLAY0_BASECOLOR_MAP) 55 ov.ov0_albedo = _PBR_Overlay0_BaseColorTex.SampleBias(GET_SAMPLER_OV0, 56 UV_SCOFF(i, _PBR_Overlay0_BaseColorTex_ST, _PBR_Overlay0_UV_Select), 57 _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias); 58 ov.ov0_albedo *= _PBR_Overlay0_BaseColor; 59#else 60 ov.ov0_albedo = _PBR_Overlay0_BaseColor; 61#endif // _PBR_OVERLAY0_BASECOLOR_MAP 62 63#if defined(_PBR_OVERLAY0_ROUGHNESS) 64#if defined(_PBR_OVERLAY0_ROUGHNESS_MAP) 65 ov.ov0_roughness = _PBR_Overlay0_RoughnessTex.SampleBias(GET_SAMPLER_OV0, 66 UV_SCOFF(i, _PBR_Overlay0_RoughnessTex_ST, _PBR_Overlay0_UV_Select), 67 _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias); 68 ov.ov0_roughness *= _PBR_Overlay0_Roughness; 69#else 70 ov.ov0_roughness = _PBR_Overlay0_Roughness; 71#endif // _PBR_OVERLAY0_ROUGHNESS_MAP 72#endif 73 74#if defined(_PBR_OVERLAY0_METALLIC) 75#if defined(_PBR_OVERLAY0_METALLIC_MAP) 76 ov.ov0_metallic = _PBR_Overlay0_MetallicTex.SampleBias(GET_SAMPLER_OV0, 77 UV_SCOFF(i, _PBR_Overlay0_MetallicTex_ST, _PBR_Overlay0_UV_Select), 78 _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias); 79 ov.ov0_metallic *= _PBR_Overlay0_Metallic; 80#else 81 ov.ov0_metallic = _PBR_Overlay0_Metallic; 82#endif // _PBR_OVERLAY0_METALLIC_MAP 83#endif 84 85#if defined(_PBR_OVERLAY0_MASK) 86 ov.ov0_mask = _PBR_Overlay0_Mask.SampleLevel(GET_SAMPLER_OV0, 87 UV_SCOFF(i, _PBR_Overlay0_Mask_ST, _PBR_Overlay0_UV_Select), 88 get_uv_by_channel(i, _PBR_Overlay0_UV_Select), 0); 89 ov.ov0_mask = ((bool) round(_PBR_Overlay0_Mask_Invert)) ? 1.0 - ov.ov0_mask : ov.ov0_mask; 90#else 91 ov.ov0_mask = 1; 92#endif 93 ov.ov0_albedo.a *= ov.ov0_mask; 94#endif // _PBR_OVERLAY0 95 96#if defined(_PBR_OVERLAY1) 97#if defined(_PBR_OVERLAY1_BASECOLOR_MAP) 98 ov.ov1_albedo = _PBR_Overlay1_BaseColorTex.SampleBias(GET_SAMPLER_OV1, 99 UV_SCOFF(i, _PBR_Overlay1_BaseColorTex_ST, _PBR_Overlay1_UV_Select), 100 _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias); 101 ov.ov1_albedo *= _PBR_Overlay1_BaseColor; 102#else 103 ov.ov1_albedo = _PBR_Overlay1_BaseColor; 104#endif // _PBR_OVERLAY1_BASECOLOR_MAP 105 106#if defined(_PBR_OVERLAY1_ROUGHNESS) 107#if defined(_PBR_OVERLAY1_ROUGHNESS_MAP) 108 ov.ov1_roughness = _PBR_Overlay1_RoughnessTex.SampleBias(GET_SAMPLER_OV1, 109 UV_SCOFF(i, _PBR_Overlay1_RoughnessTex_ST, _PBR_Overlay1_UV_Select), 110 _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias); 111 ov.ov1_roughness *= _PBR_Overlay1_Roughness; 112#else 113 ov.ov1_roughness = _PBR_Overlay1_Roughness; 114#endif // _PBR_OVERLAY1_ROUGHNESS_MAP 115#endif 116 117#if defined(_PBR_OVERLAY1_METALLIC) 118#if defined(_PBR_OVERLAY1_METALLIC_MAP) 119 ov.ov1_metallic = _PBR_Overlay1_MetallicTex.SampleBias(GET_SAMPLER_OV1, 120 UV_SCOFF(i, _PBR_Overlay1_MetallicTex_ST, _PBR_Overlay1_UV_Select), 121 _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias); 122 ov.ov1_metallic *= _PBR_Overlay1_Metallic; 123#else 124 ov.ov1_metallic = _PBR_Overlay1_Metallic; 125#endif // _PBR_OVERLAY1_METALLIC_MAP 126#endif 127 128#if defined(_PBR_OVERLAY1_MASK) 129 ov.ov1_mask = _PBR_Overlay1_Mask.SampleLevel(GET_SAMPLER_OV1, 130 UV_SCOFF(i, _PBR_Overlay1_Mask_ST, _PBR_Overlay1_UV_Select), 0); 131 ov.ov1_mask = ((bool) round(_PBR_Overlay1_Mask_Invert)) ? 1.0 - ov.ov1_mask : ov.ov1_mask; 132#else 133 ov.ov1_mask = 1; 134#endif 135 ov.ov1_albedo.a *= ov.ov1_mask; 136#endif // _PBR_OVERLAY1 137 138#if defined(_PBR_OVERLAY2) 139#if defined(_PBR_OVERLAY2_BASECOLOR_MAP) 140 ov.ov2_albedo = _PBR_Overlay2_BaseColorTex.SampleBias(GET_SAMPLER_OV2, 141 UV_SCOFF(i, _PBR_Overlay2_BaseColorTex_ST, _PBR_Overlay2_UV_Select), 142 _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias); 143 ov.ov2_albedo *= _PBR_Overlay2_BaseColor; 144#else 145 ov.ov2_albedo = _PBR_Overlay2_BaseColor; 146#endif // _PBR_OVERLAY2_BASECOLOR_MAP 147 148#if defined(_PBR_OVERLAY2_ROUGHNESS) 149#if defined(_PBR_OVERLAY2_ROUGHNESS_MAP) 150 ov.ov2_roughness = _PBR_Overlay2_RoughnessTex.SampleBias(GET_SAMPLER_OV2, 151 UV_SCOFF(i, _PBR_Overlay2_RoughnessTex_ST, _PBR_Overlay2_UV_Select), 152 _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias); 153 ov.ov2_roughness *= _PBR_Overlay2_Roughness; 154#else 155 ov.ov2_roughness = _PBR_Overlay2_Roughness; 156#endif // _PBR_OVERLAY2_ROUGHNESS_MAP 157#endif 158 159#if defined(_PBR_OVERLAY2_METALLIC) 160#if defined(_PBR_OVERLAY2_METALLIC_MAP) 161 ov.ov2_metallic = _PBR_Overlay2_MetallicTex.SampleBias(GET_SAMPLER_OV2, 162 UV_SCOFF(i, _PBR_Overlay2_MetallicTex_ST, _PBR_Overlay2_UV_Select), 163 _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias); 164 ov.ov2_metallic *= _PBR_Overlay2_Metallic; 165#else 166 ov.ov2_metallic = _PBR_Overlay2_Metallic; 167#endif // _PBR_OVERLAY2_METALLIC_MAP 168#endif 169 170#if defined(_PBR_OVERLAY2_MASK) 171 ov.ov2_mask = _PBR_Overlay2_Mask.SampleLevel(GET_SAMPLER_OV2, 172 UV_SCOFF(i, _PBR_Overlay2_Mask_ST, _PBR_Overlay2_UV_Select), 0); 173 ov.ov2_mask = ((bool) round(_PBR_Overlay2_Mask_Invert)) ? 1.0 - ov.ov2_mask : ov.ov2_mask; 174#else 175 ov.ov2_mask = 1; 176#endif 177 ov.ov2_albedo.a *= ov.ov2_mask; 178#endif // _PBR_OVERLAY2 179 180#if defined(_PBR_OVERLAY3) 181#if defined(_PBR_OVERLAY3_BASECOLOR_MAP) 182 ov.ov3_albedo = _PBR_Overlay3_BaseColorTex.SampleBias(GET_SAMPLER_OV3, 183 UV_SCOFF(i, _PBR_Overlay3_BaseColorTex_ST, _PBR_Overlay3_UV_Select), 184 _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias); 185 ov.ov3_albedo *= _PBR_Overlay3_BaseColor; 186#else 187 ov.ov3_albedo = _PBR_Overlay3_BaseColor; 188#endif // _PBR_OVERLAY3_BASECOLOR_MAP 189 190#if defined(_PBR_OVERLAY3_ROUGHNESS) 191#if defined(_PBR_OVERLAY3_ROUGHNESS_MAP) 192 ov.ov3_roughness = _PBR_Overlay3_RoughnessTex.SampleBias(GET_SAMPLER_OV3, 193 UV_SCOFF(i, _PBR_Overlay3_RoughnessTex_ST, _PBR_Overlay3_UV_Select), 194 _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias); 195 ov.ov3_roughness *= _PBR_Overlay3_Roughness; 196#else 197 ov.ov3_roughness = _PBR_Overlay3_Roughness; 198#endif // _PBR_OVERLAY3_ROUGHNESS_MAP 199#endif 200 201#if defined(_PBR_OVERLAY3_METALLIC) 202#if defined(_PBR_OVERLAY3_METALLIC_MAP) 203 ov.ov3_metallic = _PBR_Overlay3_MetallicTex.SampleBias(GET_SAMPLER_OV3, 204 UV_SCOFF(i, _PBR_Overlay3_MetallicTex_ST, _PBR_Overlay3_UV_Select), 205 _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias); 206 ov.ov3_metallic *= _PBR_Overlay3_Metallic; 207#else 208 ov.ov3_metallic = _PBR_Overlay3_Metallic; 209#endif // _PBR_OVERLAY3_METALLIC_MAP 210#endif 211 212#if defined(_PBR_OVERLAY3_MASK) 213 ov.ov3_mask = _PBR_Overlay3_Mask.SampleLevel(GET_SAMPLER_OV3, 214 UV_SCOFF(i, _PBR_Overlay3_Mask_ST, _PBR_Overlay3_UV_Select), 0); 215 ov.ov3_mask = ((bool) round(_PBR_Overlay3_Mask_Invert)) ? 1.0 - ov.ov3_mask : ov.ov3_mask; 216#else 217 ov.ov3_mask = 1; 218#endif 219 ov.ov3_albedo.a *= ov.ov3_mask; 220#endif // _PBR_OVERLAY3 221} 222 223void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, 224 inout float roughness, inout float metallic, PbrOverlay ov, 225 float mask, out float glitter_mask) { 226 glitter_mask = 1; 227 // Calculate alpha masks before we start mutating alpha. 228#if defined(_PBR_OVERLAY0) 229 float a0 = saturate(ov.ov0_albedo.a * _PBR_Overlay0_Alpha_Multiplier); 230 if (_PBR_Overlay0_Constrain_By_Alpha) { 231 bool in_range = (albedo.a > _PBR_Overlay0_Constrain_By_Alpha_Min) * 232 (albedo.a < _PBR_Overlay0_Constrain_By_Alpha_Max); 233 a0 *= in_range; 234 } 235 a0 *= mask; 236 a0 *= ov.ov0_mask; 237 glitter_mask *= 1 - a0 * _PBR_Overlay0_Mask_Glitter; 238#endif 239#if defined(_PBR_OVERLAY1) 240 float a1 = saturate(ov.ov1_albedo.a * _PBR_Overlay1_Alpha_Multiplier); 241 if (_PBR_Overlay1_Constrain_By_Alpha) { 242 bool in_range = (albedo.a > _PBR_Overlay1_Constrain_By_Alpha_Min) * 243 (albedo.a < _PBR_Overlay1_Constrain_By_Alpha_Max); 244 a1 *= in_range; 245 } 246 a1 *= mask; 247 a1 *= ov.ov1_mask; 248 glitter_mask *= 1 - a1 * _PBR_Overlay1_Mask_Glitter; 249#endif 250#if defined(_PBR_OVERLAY2) 251 float a2 = saturate(ov.ov2_albedo.a * _PBR_Overlay2_Alpha_Multiplier); 252 if (_PBR_Overlay2_Constrain_By_Alpha) { 253 bool in_range = (albedo.a > _PBR_Overlay2_Constrain_By_Alpha_Min) * 254 (albedo.a < _PBR_Overlay2_Constrain_By_Alpha_Max); 255 a2 *= in_range; 256 } 257 a2 *= mask; 258 a2 *= ov.ov2_mask; 259 glitter_mask *= 1 - a2 * _PBR_Overlay2_Mask_Glitter; 260#endif 261#if defined(_PBR_OVERLAY3) 262 float a3 = saturate(ov.ov3_albedo.a * _PBR_Overlay3_Alpha_Multiplier); 263 if (_PBR_Overlay3_Constrain_By_Alpha) { 264 bool in_range = (albedo.a > _PBR_Overlay3_Constrain_By_Alpha_Min) * 265 (albedo.a < _PBR_Overlay3_Constrain_By_Alpha_Max); 266 a3 *= in_range; 267 } 268 a3 *= mask; 269 a3 *= ov.ov3_mask; 270 glitter_mask *= 1 - a3 * _PBR_Overlay3_Mask_Glitter; 271#endif 272 273#if defined(_PBR_OVERLAY0) 274#if defined(_PBR_OVERLAY0_MIX_ALPHA_BLEND) 275 albedo.rgb = lerp(albedo.rgb, ov.ov0_albedo.rgb, a0); 276#if defined(_PBR_OVERLAY0_ROUGHNESS) 277 roughness = lerp(roughness, ov.ov0_roughness, a0); 278#endif 279#if defined(_PBR_OVERLAY0_METALLIC) 280 metallic = lerp(metallic, ov.ov0_metallic, a0); 281#endif 282 albedo.a = max(albedo.a, a0); 283#elif defined(_PBR_OVERLAY0_MIX_ADD) 284 albedo.rgb += ov.ov0_albedo * mask * ov.ov0_mask; 285#elif defined(_PBR_OVERLAY0_MIX_MIN) 286 albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov0_albedo), mask * ov.ov0_mask); 287#elif defined(_PBR_OVERLAY0_MIX_MAX) 288 albedo.rgb = max(albedo.rgb, ov.ov0_albedo * mask * ov.ov0_mask); 289#elif defined(_PBR_OVERLAY0_MIX_MULTIPLY) 290 albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov0_albedo, mask * ov.ov0_mask); 291#endif 292#endif 293 294#if defined(_PBR_OVERLAY1) 295#if defined(_PBR_OVERLAY1_MIX_ALPHA_BLEND) 296 albedo.rgb = lerp(albedo.rgb, ov.ov1_albedo.rgb, a1); 297#if defined(_PBR_OVERLAY1_ROUGHNESS) 298 roughness = lerp(roughness, ov.ov1_roughness, a1); 299#endif 300#if defined(_PBR_OVERLAY1_METALLIC) 301 metallic = lerp(metallic, ov.ov1_metallic, a1); 302#endif 303 albedo.a = max(albedo.a, a1); 304#elif defined(_PBR_OVERLAY1_MIX_ADD) 305 albedo.rgb += ov.ov1_albedo * mask * ov.ov1_mask; 306#elif defined(_PBR_OVERLAY1_MIX_MIN) 307 albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov1_albedo), mask * ov.ov1_mask); 308#elif defined(_PBR_OVERLAY1_MIX_MAX) 309 albedo.rgb = max(albedo.rgb, ov.ov1_albedo * mask * ov.ov1_mask); 310#elif defined(_PBR_OVERLAY1_MIX_MULTIPLY) 311 albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov1_albedo, mask * ov.ov1_mask); 312#endif 313#endif 314 315#if defined(_PBR_OVERLAY2) 316#if defined(_PBR_OVERLAY2_MIX_ALPHA_BLEND) 317 albedo.rgb = lerp(albedo.rgb, ov.ov2_albedo.rgb, a2); 318#if defined(_PBR_OVERLAY2_ROUGHNESS) 319 roughness = lerp(roughness, ov.ov2_roughness, a2); 320#endif 321#if defined(_PBR_OVERLAY2_METALLIC) 322 metallic = lerp(metallic, ov.ov2_metallic, a2); 323#endif 324 albedo.a = max(albedo.a, a2); 325#elif defined(_PBR_OVERLAY2_MIX_ADD) 326 albedo.rgb += ov.ov2_albedo * mask * ov.ov2_mask; 327#elif defined(_PBR_OVERLAY2_MIX_MIN) 328 albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov2_albedo), mask * ov.ov2_mask); 329#elif defined(_PBR_OVERLAY2_MIX_MAX) 330 albedo.rgb = max(albedo.rgb, ov.ov2_albedo * mask * ov.ov2_mask); 331#elif defined(_PBR_OVERLAY2_MIX_MULTIPLY) 332 albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov2_albedo, mask * ov.ov2_mask); 333#endif 334#endif 335 336#if defined(_PBR_OVERLAY3) 337#if defined(_PBR_OVERLAY3_MIX_ALPHA_BLEND) 338 albedo.rgb = lerp(albedo.rgb, ov.ov3_albedo.rgb, a3); 339#if defined(_PBR_OVERLAY3_ROUGHNESS) 340 roughness = lerp(roughness, ov.ov3_roughness, a3); 341#endif 342#if defined(_PBR_OVERLAY3_METALLIC) 343 metallic = lerp(metallic, ov.ov3_metallic, a3); 344#endif 345 albedo.a = max(albedo.a, a3); 346#elif defined(_PBR_OVERLAY3_MIX_ADD) 347 albedo.rgb += ov.ov3_albedo * mask * ov.ov3_mask; 348#elif defined(_PBR_OVERLAY3_MIX_MIN) 349 albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, ov.ov3_albedo), mask * ov.ov3_mask); 350#elif defined(_PBR_OVERLAY3_MIX_MAX) 351 albedo.rgb = max(albedo.rgb, ov.ov3_albedo * mask * ov.ov3_mask); 352#elif defined(_PBR_OVERLAY3_MIX_MULTIPLY) 353 albedo.rgb = lerp(albedo.rgb, albedo.rgb * ov.ov3_albedo, mask * ov.ov3_mask); 354#endif 355#endif 356} 357 358void applyOverlayNormal(inout float3 raw_normal, float4 albedo, PbrOverlay ov, v2f i) 359{ 360 float3 raw_normal_2; 361#if defined(_PBR_OVERLAY0) && defined(_PBR_OVERLAY0_NORMAL_MAP) 362 float a0 = 1; 363 if (_PBR_Overlay0_Constrain_By_Alpha) { 364 bool in_range = (albedo.a > _PBR_Overlay0_Constrain_By_Alpha_Min) * 365 (albedo.a < _PBR_Overlay0_Constrain_By_Alpha_Max); 366 a0 *= in_range; 367 } 368 // Use UVs to smoothly blend between fully detailed normals when close up and 369 // flat normals when far away. If we don't do this, then we see moire effects 370 // on e.g. striped normal maps. 371 raw_normal_2 = UnpackScaleNormal(_PBR_Overlay0_NormalTex.SampleBias(GET_SAMPLER_OV0, 372 UV_SCOFF(i, _PBR_Overlay0_NormalTex_ST, _PBR_Overlay0_UV_Select), 373 _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias), 374 _PBR_Overlay0_Tex_NormalStr * ov.ov0_mask * a0); 375 376 raw_normal = BlendNormals( 377 raw_normal, 378 raw_normal_2); 379#endif // _PBR_OVERLAY0 && _PBR_OVERLAY0_NORMAL_MAP 380#if defined(_PBR_OVERLAY1) && defined(_PBR_OVERLAY1_NORMAL_MAP) 381 float a1 = 1; 382 if (_PBR_Overlay1_Constrain_By_Alpha) { 383 bool in_range = (albedo.a > _PBR_Overlay1_Constrain_By_Alpha_Min) * 384 (albedo.a < _PBR_Overlay1_Constrain_By_Alpha_Max); 385 a1 *= in_range; 386 } 387 raw_normal_2 = UnpackScaleNormal(_PBR_Overlay1_NormalTex.SampleBias(GET_SAMPLER_OV1, 388 UV_SCOFF(i, _PBR_Overlay1_NormalTex_ST, _PBR_Overlay1_UV_Select), 389 _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias), 390 _PBR_Overlay1_Tex_NormalStr * ov.ov1_mask * a1); 391 392 raw_normal = BlendNormals( 393 raw_normal, 394 raw_normal_2); 395#endif // _PBR_OVERLAY1 && _PBR_OVERLAY1_NORMAL_MAP 396#if defined(_PBR_OVERLAY2) && defined(_PBR_OVERLAY2_NORMAL_MAP) 397 float a2 = 1; 398 if (_PBR_Overlay2_Constrain_By_Alpha) { 399 bool in_range = (albedo.a > _PBR_Overlay2_Constrain_By_Alpha_Min) * 400 (albedo.a < _PBR_Overlay2_Constrain_By_Alpha_Max); 401 a2 *= in_range; 402 } 403 raw_normal_2 = UnpackScaleNormal(_PBR_Overlay2_NormalTex.SampleBias(GET_SAMPLER_OV2, 404 UV_SCOFF(i, _PBR_Overlay2_NormalTex_ST, _PBR_Overlay2_UV_Select), 405 _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias), 406 _PBR_Overlay2_Tex_NormalStr * ov.ov2_mask * a2); 407 408 raw_normal = BlendNormals( 409 raw_normal, 410 raw_normal_2); 411#endif // _PBR_OVERLAY2 && _PBR_OVERLAY2_NORMAL_MAP 412#if defined(_PBR_OVERLAY3) && defined(_PBR_OVERLAY3_NORMAL_MAP) 413 float a3 = 1; 414 if (_PBR_Overlay3_Constrain_By_Alpha) { 415 bool in_range = (albedo.a > _PBR_Overlay3_Constrain_By_Alpha_Min) * 416 (albedo.a < _PBR_Overlay3_Constrain_By_Alpha_Max); 417 a3 *= in_range; 418 } 419 raw_normal_2 = UnpackScaleNormal(_PBR_Overlay3_NormalTex.SampleBias(GET_SAMPLER_OV3, 420 UV_SCOFF(i, _PBR_Overlay3_NormalTex_ST, _PBR_Overlay3_UV_Select), 421 _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias), 422 _PBR_Overlay3_Tex_NormalStr * ov.ov3_mask * a3); 423 424 raw_normal = BlendNormals( 425 raw_normal, 426 raw_normal_2); 427#endif // _PBR_OVERLAY3 && _PBR_OVERLAY3_NORMAL_MAP 428} 429 430float3 getOverlayEmission(PbrOverlay ov, v2f i) 431{ 432 float3 em = 0; 433#if defined(_PBR_OVERLAY0_EMISSION_MAP) 434 em += _PBR_Overlay0_EmissionTex.SampleBias(GET_SAMPLER_OV0, 435 UV_SCOFF(i, _PBR_Overlay0_EmissionTex_ST, _PBR_Overlay0_UV_Select), 436 _Global_Sample_Bias + _PBR_Overlay0_Mip_Bias) * 437 _PBR_Overlay0_Emission * ov.ov0_mask; 438#endif 439 440#if defined(_PBR_OVERLAY1_EMISSION_MAP) 441 em += _PBR_Overlay1_EmissionTex.SampleBias(GET_SAMPLER_OV1, 442 UV_SCOFF(i, _PBR_Overlay1_EmissionTex_ST, _PBR_Overlay1_UV_Select), 443 _Global_Sample_Bias + _PBR_Overlay1_Mip_Bias) * 444 _PBR_Overlay1_Emission * ov.ov1_mask; 445#endif 446 447#if defined(_PBR_OVERLAY2_EMISSION_MAP) 448 em += _PBR_Overlay2_EmissionTex.SampleBias(GET_SAMPLER_OV2, 449 UV_SCOFF(i, _PBR_Overlay2_EmissionTex_ST, _PBR_Overlay2_UV_Select), 450 _Global_Sample_Bias + _PBR_Overlay2_Mip_Bias) * 451 _PBR_Overlay2_Emission * ov.ov2_mask; 452#endif 453 454#if defined(_PBR_OVERLAY3_EMISSION_MAP) 455 em += _PBR_Overlay3_EmissionTex.SampleBias(GET_SAMPLER_OV3, 456 UV_SCOFF(i, _PBR_Overlay3_EmissionTex_ST, _PBR_Overlay3_UV_Select), 457 _Global_Sample_Bias + _PBR_Overlay3_Mip_Bias) * 458 _PBR_Overlay3_Emission * ov.ov3_mask; 459#endif 460 return em; 461} 462 463#endif // __PBR_OVERLAY_INC 464