yum-archive/Tooner

A toon shader for Unity's BIRP.

git clone https://git.yummers.dev/yum-archive/Tooner

yumAdd terrain gimmick (ds2_11) and analytic fog (fog01)ffc4bb2

master
16.3 KiB464 linesraw
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