@@ -126,40 +126,40 @@ void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out floa
126126}
127127
128128// solution to get indirect lighting to apply to all light modes
129- float3 GetUniversalIndirectLight (float3 normal )
129+ float3 GetUniversalIndirectLight (BacklaceSurfaceData Surface )
130130{
131131 float3 indirectColor = float3 (0 , 0 , 0 );
132132 #if defined (UNITY_PASS_FORWARDBASE)
133133 indirectColor = float3 (unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
134134 #if defined (LIGHTMAP_ON)
135- float3 indirectBaked = DecodeLightmap ( UNITY_SAMPLE_TEX2D (unity_Lightmap, FragData.lightmapUV)) ;
135+ float3 indirectBaked = Surface.Lightmap ;
136136 #if defined (DIRLIGHTMAP_COMBINED)
137- float3 combinedBaked = DecodeDirectionalLightmap (indirectBaked, LightmapDirection, normal );
137+ float3 combinedBaked = DecodeDirectionalLightmap (indirectBaked, Surface. LightmapDirection, Surface.NormalDir );
138138 float3 directBaked = combinedBaked - indirectBaked;
139139 indirectColor = (indirectBaked * _BakedIndirectIntensity) + (directBaked * _BakedDirectIntensity);
140- #else
140+ #else // DIRLIGHTMAP_COMBINED
141141 indirectColor = indirectBaked * _BakedIndirectIntensity;
142- #endif
143- #endif
142+ #endif // DIRLIGHTMAP_COMBINED
143+ #endif // LIGHTMAP_ON
144144 #if defined (DYNAMICLIGHTMAP_ON)
145145 #if defined (DIRLIGHTMAP_COMBINED)
146- indirectColor += DecodeDirectionalLightmap (DynamicLightmap, DynamicLightmapDirection, normal );
147- #else
148- indirectColor += DynamicLightmap;
149- #endif
150- #endif
151- #endif
146+ indirectColor += DecodeDirectionalLightmap (Surface. DynamicLightmap, Surface. DynamicLightmapDirection, Surface.NormalDir );
147+ #else // DIRLIGHTMAP_COMBINED
148+ indirectColor += Surface. DynamicLightmap;
149+ #endif // DIRLIGHTMAP_COMBINED
150+ #endif // DYNAMICLIGHTMAP_ON
151+ #endif // UNITY_PASS_FORWARDBASE
152152 return indirectColor;
153153}
154154
155155// the original backlace light color function
156- void GetBacklaceLightColor (inout BacklaceLightData lightData, float3 normal )
156+ void GetBacklaceLightColor (inout BacklaceLightData lightData, BacklaceSurfaceData Surface )
157157{
158158 #if defined (UNITY_PASS_FORWARDBASE)
159159 lightData.directColor = _LightColor0.rgb;
160- lightData.indirectColor = GetUniversalIndirectLight (normal );
160+ lightData.indirectColor = GetUniversalIndirectLight (Surface );
161161 // lightData.directColor = lerp(GetSHLength(), lightData.directColor, .75);
162- float3 ambientColor = ShadeSH9 (float4 (normal , 1.0 )); // note: upgraded from SHLength to full SH eval
162+ float3 ambientColor = ShadeSH9 (float4 (Surface.NormalDir , 1.0 )); // note: upgraded from SHLength to full SH eval
163163 lightData.directColor = lerp (ambientColor, lightData.directColor, 0.75 );
164164 if (any (_WorldSpaceLightPos0.xyz) == 0 || _LightColor0.a < 0.01 )
165165 {
@@ -175,7 +175,7 @@ void GetBacklaceLightColor(inout BacklaceLightData lightData, float3 normal)
175175}
176176
177177// From Poiyomi For Poiyomi Lighting Mode
178- void GetPoiyomiLightColor (inout BacklaceLightData lightData, float3 normal )
178+ void GetPoiyomiLightColor (inout BacklaceLightData lightData, BacklaceSurfaceData Surface )
179179{
180180 #if defined (UNITY_PASS_FORWARDBASE)
181181 float3 ambientMagic = max (BetterSH9 (normalize (unity_SHAr + unity_SHAg + unity_SHAb)), 0 );
@@ -196,8 +196,8 @@ void GetPoiyomiLightColor(inout BacklaceLightData lightData, float3 normal)
196196 {
197197 lightData.directColor = float3 (0 , 0 , 0 );
198198 }
199- lightData.indirectColor = GetUniversalIndirectLight (normal );
200- bool lightExists = any (_WorldSpaceLightPos0.xyz) && _LightColor0.a > 0.01 ;
199+ lightData.indirectColor = GetUniversalIndirectLight (Surface );
200+ bool lightExists = dot (_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz) > 0.000001 && _LightColor0.a > 0.01 ;
201201 #if defined (BACKLACE_TOON)
202202 if (!lightExists > 0 )
203203 {
@@ -212,13 +212,13 @@ void GetPoiyomiLightColor(inout BacklaceLightData lightData, float3 normal)
212212}
213213
214214// From OpenLit For OpenLit Lighting Mode
215- void GetOpenLitLightColor (inout BacklaceLightData lightData, float3 normal )
215+ void GetOpenLitLightColor (inout BacklaceLightData lightData, BacklaceSurfaceData Surface )
216216{
217217 #if defined (UNITY_PASS_FORWARDBASE)
218218 float3 directSH, indirectSH_OpenLit;
219- OpenLitShadeSH9ToonDouble (normal , directSH, indirectSH_OpenLit);
219+ OpenLitShadeSH9ToonDouble (Surface.NormalDir , directSH, indirectSH_OpenLit);
220220 lightData.directColor = directSH + _LightColor0.rgb;
221- lightData.indirectColor = GetUniversalIndirectLight (normal );
221+ lightData.indirectColor = GetUniversalIndirectLight (Surface );
222222 bool lightExists = any (_WorldSpaceLightPos0.xyz) && _LightColor0.a > 0.01 ;
223223 #if defined (BACKLACE_TOON)
224224 if (!lightExists)
@@ -234,11 +234,11 @@ void GetOpenLitLightColor(inout BacklaceLightData lightData, float3 normal)
234234}
235235
236236// naive unity light colour functions
237- void GetStandardLightColor (inout BacklaceLightData lightData, float3 normal )
237+ void GetStandardLightColor (inout BacklaceLightData lightData, BacklaceSurfaceData Surface )
238238{
239239 #if defined (UNITY_PASS_FORWARDBASE)
240240 bool lightExists = any (_WorldSpaceLightPos0.xyz) && _LightColor0.a > 0.01 ;
241- lightData.indirectColor = GetUniversalIndirectLight (normal );
241+ lightData.indirectColor = GetUniversalIndirectLight (Surface );
242242 if (lightExists)
243243 {
244244 lightData.directColor = _LightColor0.rgb;
@@ -261,18 +261,18 @@ void GetStandardLightColor(inout BacklaceLightData lightData, float3 normal)
261261}
262262
263263// From Mochie For Mochie Lighting Mode
264- void GetMochieLightColor (inout BacklaceLightData lightData, float3 normal )
264+ void GetMochieLightColor (inout BacklaceLightData lightData, BacklaceSurfaceData Surface )
265265{
266266 #if defined (UNITY_PASS_FORWARDBASE)
267267 bool lightExists = any (_WorldSpaceLightPos0.xyz);
268- lightData.indirectColor = GetUniversalIndirectLight (normal );
268+ lightData.indirectColor = GetUniversalIndirectLight (Surface );
269269 if (lightExists)
270270 {
271271 lightData.directColor = _LightColor0.rgb;
272272 }
273273 else
274274 {
275- lightData.directColor = ShadeSHNL (normal );
275+ lightData.directColor = ShadeSHNL (Surface.NormalDir );
276276 }
277277 if (!lightExists || _LightColor0.a < 0.01 )
278278 {
@@ -353,6 +353,32 @@ void GetLightData(inout BacklaceSurfaceData Surface)
353353{
354354 BacklaceLightData lightData;
355355 #if defined (UNITY_PASS_FORWARDBASE)
356+ // static lightmap
357+ #if defined (LIGHTMAP_ON)
358+ Surface.Lightmap = DecodeLightmap (UNITY_SAMPLE_TEX2D (unity_Lightmap, FragData.lightmapUV));
359+ Surface.Lightmap = max (Surface.Lightmap, 0 );
360+ #if defined (DIRLIGHTMAP_COMBINED)
361+ Surface.LightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER (unity_LightmapInd, unity_Lightmap, FragData.lightmapUV);
362+ #else // DIRLIGHTMAP_COMBINED
363+ Surface.LightmapDirection = float4 (0 , 0 , 0 , 0 );
364+ #endif // DIRLIGHTMAP_COMBINED
365+ #else // LIGHTMAP_ON
366+ Surface.Lightmap = float3 (0 , 0 , 0 );
367+ Surface.LightmapDirection = float4 (0 , 0 , 0 , 0 );
368+ #endif // LIGHTMAP_ON
369+ // dynamic lightmap
370+ #if defined (DYNAMICLIGHTMAP_ON)
371+ Surface.DynamicLightmap = DecodeRealtimeLightmap (UNITY_SAMPLE_TEX2D (unity_DynamicLightmap, FragData.dynamicLightmapUV));
372+ Surface.DynamicLightmap = max (Surface.DynamicLightmap, 0 );
373+ #if defined (DIRLIGHTMAP_COMBINED)
374+ Surface.DynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER (unity_DynamicDirectionality, unity_DynamicLightmap, FragData.dynamicLightmapUV);
375+ #else // DIRLIGHTMAP_COMBINED
376+ Surface.DynamicLightmapDirection = float4 (0 , 0 , 0 , 0 );
377+ #endif // DIRLIGHTMAP_COMBINED
378+ #else
379+ Surface.DynamicLightmap = float3 (0 , 0 , 0 );
380+ Surface.DynamicLightmapDirection = float4 (0 , 0 , 0 , 0 );
381+ #endif // DYNAMICLIGHTMAP_ON
356382 UNITY_LIGHT_ATTENUATION (attenuation, FragData, FragData.worldPos);
357383 lightData.attenuation = FadeShadows (FragData, attenuation);
358384 switch (_LightingDirectionMode)
@@ -379,23 +405,23 @@ void GetLightData(inout BacklaceSurfaceData Surface)
379405 Surface.HalfDir = Unity_SafeNormalize (Surface.LightDir + Surface.ViewDir);
380406 switch (_LightingColorMode)
381407 {
382- case 1 : GetPoiyomiLightColor (lightData, Surface.NormalDir ); break ;
383- case 2 : GetOpenLitLightColor (lightData, Surface.NormalDir ); break ;
384- case 3 : GetStandardLightColor (lightData, Surface.NormalDir ); break ;
385- case 4 : GetMochieLightColor (lightData, Surface.NormalDir ); break ;
386- case 0 : default : GetBacklaceLightColor (lightData, Surface.NormalDir ); break ;
408+ case 1 : GetPoiyomiLightColor (lightData, Surface); break ;
409+ case 2 : GetOpenLitLightColor (lightData, Surface); break ;
410+ case 3 : GetStandardLightColor (lightData, Surface); break ;
411+ case 4 : GetMochieLightColor (lightData, Surface); break ;
412+ case 0 : default : GetBacklaceLightColor (lightData, Surface); break ;
387413 }
388414 #else // UNITY_PASS_FORWARDADD
389415 GetForwardAddLightData (lightData);
390416 Surface.LightDir = lightData.direction;
391417 Surface.HalfDir = Unity_SafeNormalize (Surface.LightDir + Surface.ViewDir);
392418 switch (_LightingColorMode)
393419 {
394- case 1 : GetPoiyomiLightColor (lightData, Surface.NormalDir ); break ;
395- case 2 : GetOpenLitLightColor (lightData, Surface.NormalDir ); break ;
396- case 3 : GetStandardLightColor (lightData, Surface.NormalDir ); break ;
397- case 4 : GetMochieLightColor (lightData, Surface.NormalDir ); break ;
398- case 0 : default : GetBacklaceLightColor (lightData, Surface.NormalDir ); break ;
420+ case 1 : GetPoiyomiLightColor (lightData, Surface); break ;
421+ case 2 : GetOpenLitLightColor (lightData, Surface); break ;
422+ case 3 : GetStandardLightColor (lightData, Surface); break ;
423+ case 4 : GetMochieLightColor (lightData, Surface); break ;
424+ case 0 : default : GetBacklaceLightColor (lightData, Surface); break ;
399425 }
400426 #endif
401427 //global modifiers for both passes
0 commit comments