Skip to content

Commit 98f124d

Browse files
committed
ligntmap fixes
1 parent b030065 commit 98f124d

File tree

4 files changed

+70
-40
lines changed

4 files changed

+70
-40
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## Version 2.0.1
2+
- Improve light checks
3+
- Fix lightmaps not being assigned properly
4+
15
## Version 2.0.0
26
- Normal map toggle for better performance, allow deriving normal from albedo as well
37
- New UI tab "Shading" (and old "Shading" was renamed to "Stylise")

Shaders/Includes/Backlace_Lighting.cginc

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Shaders/Includes/Backlace_Properties.cginc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@
44
// global variables
55
FragmentData FragData;
66
float3 NormalMap;
7-
float3 Lightmap;
87
float GFS;
98
float3 NDF;
10-
float3 DynamicLightmap;
11-
float4 LightmapDirection;
12-
float4 DynamicLightmapDirection;
139
float4 Msso;
1410
float RoughnessSquared;
1511
float RampAttenuation;

Shaders/Includes/Backlace_Universal.cginc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ struct BacklaceSurfaceData
4242
float3 IndirectSpecular;
4343
float3 VertexDirectDiffuse;
4444
float Attenuation;
45+
float3 Lightmap;
46+
float4 LightmapDirection;
47+
float3 DynamicLightmap;
48+
float4 DynamicLightmapDirection;
4549
// specular intermediates
4650
float3 SpecularColor;
4751
float3 EnergyCompensation;

0 commit comments

Comments
 (0)