yum/3ner

A toon shader for Unity's BIRP.

git clone https://git.yummers.dev/yum/3ner

yumFallback cubemap turns on when scene has no reflection probe110b619

master
16.6 KiB352 linesraw
1#ifndef __FILAMENTED_INC
2#define __FILAMENTED_INC
3
4#include "data.cginc"
5#include "globals.cginc"
6#include "math.cginc"
7#include "poi.cginc"
8
9/*
10
11                                 Apache License
12                           Version 2.0, January 2004
13                        http://www.apache.org/licenses/
14
15   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
16
17   1. Definitions.
18
19      "License" shall mean the terms and conditions for use, reproduction,
20      and distribution as defined by Sections 1 through 9 of this document.
21
22      "Licensor" shall mean the copyright owner or entity authorized by
23      the copyright owner that is granting the License.
24
25      "Legal Entity" shall mean the union of the acting entity and all
26      other entities that control, are controlled by, or are under common
27      control with that entity. For the purposes of this definition,
28      "control" means (i) the power, direct or indirect, to cause the
29      direction or management of such entity, whether by contract or
30      otherwise, or (ii) ownership of fifty percent (50%) or more of the
31      outstanding shares, or (iii) beneficial ownership of such entity.
32
33      "You" (or "Your") shall mean an individual or Legal Entity
34      exercising permissions granted by this License.
35
36      "Source" form shall mean the preferred form for making modifications,
37      including but not limited to software source code, documentation
38      source, and configuration files.
39
40      "Object" form shall mean any form resulting from mechanical
41      transformation or translation of a Source form, including but
42      not limited to compiled object code, generated documentation,
43      and conversions to other media types.
44
45      "Work" shall mean the work of authorship, whether in Source or
46      Object form, made available under the License, as indicated by a
47      copyright notice that is included in or attached to the work
48      (an example is provided in the Appendix below).
49
50      "Derivative Works" shall mean any work, whether in Source or Object
51      form, that is based on (or derived from) the Work and for which the
52      editorial revisions, annotations, elaborations, or other modifications
53      represent, as a whole, an original work of authorship. For the purposes
54      of this License, Derivative Works shall not include works that remain
55      separable from, or merely link (or bind by name) to the interfaces of,
56      the Work and Derivative Works thereof.
57
58      "Contribution" shall mean any work of authorship, including
59      the original version of the Work and any modifications or additions
60      to that Work or Derivative Works thereof, that is intentionally
61      submitted to Licensor for inclusion in the Work by the copyright owner
62      or by an individual or Legal Entity authorized to submit on behalf of
63      the copyright owner. For the purposes of this definition, "submitted"
64      means any form of electronic, verbal, or written communication sent
65      to the Licensor or its representatives, including but not limited to
66      communication on electronic mailing lists, source code control systems,
67      and issue tracking systems that are managed by, or on behalf of, the
68      Licensor for the purpose of discussing and improving the Work, but
69      excluding communication that is conspicuously marked or otherwise
70      designated in writing by the copyright owner as "Not a Contribution."
71
72      "Contributor" shall mean Licensor and any individual or Legal Entity
73      on behalf of whom a Contribution has been received by Licensor and
74      subsequently incorporated within the Work.
75
76   2. Grant of Copyright License. Subject to the terms and conditions of
77      this License, each Contributor hereby grants to You a perpetual,
78      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
79      copyright license to reproduce, prepare Derivative Works of,
80      publicly display, publicly perform, sublicense, and distribute the
81      Work and such Derivative Works in Source or Object form.
82
83   3. Grant of Patent License. Subject to the terms and conditions of
84      this License, each Contributor hereby grants to You a perpetual,
85      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
86      (except as stated in this section) patent license to make, have made,
87      use, offer to sell, sell, import, and otherwise transfer the Work,
88      where such license applies only to those patent claims licensable
89      by such Contributor that are necessarily infringed by their
90      Contribution(s) alone or by combination of their Contribution(s)
91      with the Work to which such Contribution(s) was submitted. If You
92      institute patent litigation against any entity (including a
93      cross-claim or counterclaim in a lawsuit) alleging that the Work
94      or a Contribution incorporated within the Work constitutes direct
95      or contributory patent infringement, then any patent licenses
96      granted to You under this License for that Work shall terminate
97      as of the date such litigation is filed.
98
99   4. Redistribution. You may reproduce and distribute copies of the
100      Work or Derivative Works thereof in any medium, with or without
101      modifications, and in Source or Object form, provided that You
102      meet the following conditions:
103
104      (a) You must give any other recipients of the Work or
105          Derivative Works a copy of this License; and
106
107      (b) You must cause any modified files to carry prominent notices
108          stating that You changed the files; and
109
110      (c) You must retain, in the Source form of any Derivative Works
111          that You distribute, all copyright, patent, trademark, and
112          attribution notices from the Source form of the Work,
113          excluding those notices that do not pertain to any part of
114          the Derivative Works; and
115
116      (d) If the Work includes a "NOTICE" text file as part of its
117          distribution, then any Derivative Works that You distribute must
118          include a readable copy of the attribution notices contained
119          within such NOTICE file, excluding those notices that do not
120          pertain to any part of the Derivative Works, in at least one
121          of the following places: within a NOTICE text file distributed
122          as part of the Derivative Works; within the Source form or
123          documentation, if provided along with the Derivative Works; or,
124          within a display generated by the Derivative Works, if and
125          wherever such third-party notices normally appear. The contents
126          of the NOTICE file are for informational purposes only and
127          do not modify the License. You may add Your own attribution
128          notices within Derivative Works that You distribute, alongside
129          or as an addendum to the NOTICE text from the Work, provided
130          that such additional attribution notices cannot be construed
131          as modifying the License.
132
133      You may add Your own copyright statement to Your modifications and
134      may provide additional or different license terms and conditions
135      for use, reproduction, or distribution of Your modifications, or
136      for any such Derivative Works as a whole, provided Your use,
137      reproduction, and distribution of the Work otherwise complies with
138      the conditions stated in this License.
139
140   5. Submission of Contributions. Unless You explicitly state otherwise,
141      any Contribution intentionally submitted for inclusion in the Work
142      by You to the Licensor shall be under the terms and conditions of
143      this License, without any additional terms or conditions.
144      Notwithstanding the above, nothing herein shall supersede or modify
145      the terms of any separate license agreement you may have executed
146      with Licensor regarding such Contributions.
147
148   6. Trademarks. This License does not grant permission to use the trade
149      names, trademarks, service marks, or product names of the Licensor,
150      except as required for reasonable and customary use in describing the
151      origin of the Work and reproducing the content of the NOTICE file.
152
153   7. Disclaimer of Warranty. Unless required by applicable law or
154      agreed to in writing, Licensor provides the Work (and each
155      Contributor provides its Contributions) on an "AS IS" BASIS,
156      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
157      implied, including, without limitation, any warranties or conditions
158      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
159      PARTICULAR PURPOSE. You are solely responsible for determining the
160      appropriateness of using or redistributing the Work and assume any
161      risks associated with Your exercise of permissions under this License.
162
163   8. Limitation of Liability. In no event and under no legal theory,
164      whether in tort (including negligence), contract, or otherwise,
165      unless required by applicable law (such as deliberate and grossly
166      negligent acts) or agreed to in writing, shall any Contributor be
167      liable to You for damages, including any direct, indirect, special,
168      incidental, or consequential damages of any character arising as a
169      result of this License or out of the use or inability to use the
170      Work (including but not limited to damages for loss of goodwill,
171      work stoppage, computer failure or malfunction, or any and all
172      other commercial damages or losses), even if such Contributor
173      has been advised of the possibility of such damages.
174
175   9. Accepting Warranty or Additional Liability. While redistributing
176      the Work or Derivative Works thereof, You may choose to offer,
177      and charge a fee for, acceptance of support, warranty, indemnity,
178      or other liability obligations and/or rights consistent with this
179      License. However, in accepting such obligations, You may act only
180      on Your own behalf and on Your sole responsibility, not on behalf
181      of any other Contributor, and only if You agree to indemnify,
182      defend, and hold each Contributor harmless for any liability
183      incurred by, or claims asserted against, such Contributor by reason
184      of your accepting any such warranty or additional liability.
185
186   END OF TERMS AND CONDITIONS
187
188   APPENDIX: How to apply the Apache License to your work.
189
190      To apply the Apache License to your work, attach the following
191      boilerplate notice, with the fields enclosed by brackets "[]"
192      replaced with your own identifying information. (Don't include
193      the brackets!)  The text should be enclosed in the appropriate
194      comment syntax for the file format. We also recommend that a
195      file or class name and description of purpose be included on the
196      same "printed page" as the copyright notice for easier
197      identification within third-party archives.
198
199   Copyright [yyyy] [name of copyright owner]
200
201   Licensed under the Apache License, Version 2.0 (the "License");
202   you may not use this file except in compliance with the License.
203   You may obtain a copy of the License at
204
205       http://www.apache.org/licenses/LICENSE-2.0
206
207   Unless required by applicable law or agreed to in writing, software
208   distributed under the License is distributed on an "AS IS" BASIS,
209   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
210   See the License for the specific language governing permissions and
211   limitations under the License.
212
213*/
214
215#include "UnityCG.cginc"
216#include "UnityImageBasedLightingMinimal.cginc"
217
218half3 Unity_GlossyEnvironment_local (UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn)
219{
220	half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ;
221
222	// Workaround for issue where objects are blurrier than they should be
223	// due to specular AA.
224	float roughnessAdjustment = 1-perceptualRoughness;
225	roughnessAdjustment = MIN_PERCEPTUAL_ROUGHNESS * roughnessAdjustment * roughnessAdjustment;
226	perceptualRoughness = perceptualRoughness - roughnessAdjustment;
227
228	// Unity derivation
229	perceptualRoughness = perceptualRoughness*(1.7 - 0.7 * perceptualRoughness);
230	// Filament derivation
231	// perceptualRoughness = perceptualRoughness * (2.0 - perceptualRoughness);
232	half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness);
233	half3 R = glossIn.reflUVW;
234	half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip);
235
236	return DecodeHDR(rgbm, hdr);
237}
238
239UnityGIInput InitialiseUnityGIInput(float3 worldPos, float3 view_dir)
240{
241    UnityGIInput d;
242    d.worldPos = worldPos;
243    d.worldViewDir = view_dir;
244    d.probeHDR[0] = unity_SpecCube0_HDR;
245    d.probeHDR[1] = unity_SpecCube1_HDR;
246    #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION)
247      d.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
248    #endif
249    #ifdef UNITY_SPECCUBE_BOX_PROJECTION
250      d.boxMax[0] = unity_SpecCube0_BoxMax;
251      d.probePosition[0] = unity_SpecCube0_ProbePosition;
252      d.boxMax[1] = unity_SpecCube1_BoxMax;
253      d.boxMin[1] = unity_SpecCube1_BoxMin;
254      d.probePosition[1] = unity_SpecCube1_ProbePosition;
255    #endif
256    return d;
257}
258
259float3 getSpecularDominantDirection(const float3 n, const float3 r, float roughness) {
260  return lerp(r, n, roughness * roughness);
261}
262
263inline half3 UnityGI_prefilteredRadiance(const UnityGIInput data, const float perceptualRoughness, const float3 r)
264{
265    half3 specular;
266
267    Unity_GlossyEnvironmentData glossIn = (Unity_GlossyEnvironmentData)0;
268    glossIn.roughness = perceptualRoughness;
269    glossIn.reflUVW = r;
270
271    #if defined(_CUSTOM_CUBEMAP) && !defined(_GLOSSYREFLECTIONS_OFF)
272        UNITY_BRANCH
273        if (_Custom_Cubemap_Enable_Dynamic || !SceneHasReflections())
274        {
275            return Unity_GlossyEnvironment_local(
276                UNITY_PASS_TEXCUBE(_Custom_Cubemap),
277                _Custom_Cubemap_HDR,
278                glossIn);
279        }
280    #endif
281
282    #ifdef UNITY_SPECCUBE_BOX_PROJECTION
283        // we will tweak reflUVW in glossIn directly (as we pass it to Unity_GlossyEnvironment twice for probe0 and probe1), so keep original to pass into BoxProjectedCubemapDirection
284        half3 originalReflUVW = glossIn.reflUVW;
285        glossIn.reflUVW = BoxProjectedCubemapDirection (originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]);
286    #endif
287
288    #ifdef _GLOSSYREFLECTIONS_OFF
289        specular = unity_IndirectSpecColor.rgb;
290    #else
291        half3 env0 = Unity_GlossyEnvironment_local (UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn);
292        #ifdef UNITY_SPECCUBE_BLENDING
293            const float kBlendFactor = 0.99999;
294            float blendLerp = data.boxMin[0].w;
295            UNITY_BRANCH
296            if (blendLerp < kBlendFactor)
297            {
298                #ifdef UNITY_SPECCUBE_BOX_PROJECTION
299                    glossIn.reflUVW = BoxProjectedCubemapDirection (originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]);
300                #endif
301
302                half3 env1 = Unity_GlossyEnvironment_local (UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1,unity_SpecCube0), data.probeHDR[1], glossIn);
303                specular = lerp(env1, env0, blendLerp);
304            }
305            else
306            {
307                specular = env0;
308            }
309        #else
310            specular = env0;
311        #endif
312    #endif
313
314    return specular;
315}
316
317#if defined(_BENT_NORMALS)
318// Oat and Sander 2007, "Ambient Aperture Lighting"
319// Jimenez et al. 2016, "Practical Realtime Strategies for Accurate Indirect Occlusion"
320float sphericalCapsIntersection(float cosCap1, float cosCap2, float cosDistance) {
321  float r1 = acos(cosCap1);
322  float r2 = acos(cosCap2);
323  float d  = acos(cosDistance);
324
325  if (min(r1, r2) <= max(r1, r2) - d) {
326    return 1.0 - max(cosCap1, cosCap2);
327  } else if (r1 + r2 <= d) {
328    return 0.0;
329  }
330
331  float delta = abs(r1 - r2);
332  float x = 1.0 - saturate((d - delta) / max(r1 + r2 - delta, 1e-4));
333  float x2 = x * x;
334  float area = -2.0 * x2 * x + 3.0 * x2;
335  return area * (1.0 - max(cosCap1, cosCap2));
336}
337#endif  // _BENT_NORMALS
338
339float computeSpecularAO(float NoV, float visibility, float roughness, float3 bent_normal, float3 reflect_dir) {
340#if defined(_BENT_NORMALS)
341  // Jimenez et al. 2016, "Practical Realtime Strategies for Accurate Indirect Occlusion"
342  float cosAv = sqrt(1.0 - visibility);                   // aperture from AO
343  float cosAs = exp2(-3.321928 * roughness * roughness);  // aperture from roughness; log(10)/log(2) = 3.321928
344  float cosB  = dot(bent_normal, reflect_dir);            // angle between bent normal and reflection
345  return sphericalCapsIntersection(cosAv, cosAs, saturate(0.5 * cosB + 0.5)) / (1.0 - cosAs);
346#else
347  // Lagarde and de Rousiers 2014, "Moving Frostbite to Physically Based Rendering"
348  return saturate(pow(NoV + visibility, exp2(-16.0 * roughness - 1.0)) - 1.0 + visibility);
349#endif
350}
351
352#endif  // __FILAMENTED_INC