升级水插件

This commit is contained in:
2026-01-08 22:30:55 +08:00
parent febff82d24
commit ca68084264
415 changed files with 18138 additions and 7134 deletions

View File

@@ -29,6 +29,8 @@ namespace WaveHarmonic.Crest.Editor.Build
false;
#endif
static readonly string[] s_ShadowCollectorKeywords = { "SHADOWS_SINGLE_CASCADE", "SHADOWS_SPLIT_SPHERES", "SHADOWS_SOFT" };
public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data)
{
// Not one of our shaders.
@@ -49,6 +51,8 @@ namespace WaveHarmonic.Crest.Editor.Build
return;
}
// NOTE: There is no point checking against sub-shader count.
_VariantCount += data.Count;
// Strip BIRP sub-shader if not using BIRP, as Unity only strips HDRP/URP sub-shaders.
@@ -61,34 +65,36 @@ namespace WaveHarmonic.Crest.Editor.Build
for (var i = data.Count - 1; i >= 0; --i)
{
var strip = false;
var keywords = data[i].shaderKeywordSet.GetShaderKeywords();
var isLightingPass = snippet.passType is PassType.ForwardBase or PassType.ForwardAdd;
var isTransparent = keywords.Any(x => x.name == "_BUILTIN_SURFACE_TYPE_TRANSPARENT");
var isTransparentShadowReceiver = keywords.Any(x => x.name == "_BUILTIN_TRANSPARENT_RECEIVES_SHADOWS");
foreach (var keyword in keywords)
// Invalid combination.
if (isLightingPass && !isTransparent && isTransparentShadowReceiver)
{
var name = keyword.name;
var strip =
// Main light shadows. Never used.
name.StartsWithNoAlloc("_MAIN_LIGHT_") ||
// Additional lights. Never used. Although, vertex lighting keyword is set.
name.StartsWithNoAlloc("_ADDITIONAL_LIGHT") ||
// Never used. Used in deferred pass, but not defined in deferred pass.
keyword.name is "LIGHTMAP_SHADOW_MIXING" or "SHADOWS_SHADOWMASK" ||
// Never used.
keyword.name is "_SCREEN_SPACE_OCCLUSION" or "_SHADOWS_SOFT" or "_CASTING_PUNCTUAL_LIGHT_SHADOW" ||
// BIRP does not support this feature (URP does).
keyword.name is "_GBUFFER_NORMALS_OCT" ||
// TODO: check LightMode instead of pass name.
// Shadow keywords are not enabled for transparent objects, except if casting.
isTransparent && snippet.passName == "ShadowCaster" && keyword.name.Contains("SHADOW");
strip = true;
}
if (strip)
if (!strip)
{
foreach (var keyword in keywords)
{
_VariantCountStripped++;
data.RemoveAt(i);
break;
var name = keyword.name;
strip =
// Invalid combination.
isLightingPass && (!isTransparent || !isTransparentShadowReceiver) && s_ShadowCollectorKeywords.Contains(keyword.name);
if (strip) break;
}
}
if (strip)
{
_VariantCountStripped++;
data.RemoveAt(i);
}
}
}
@@ -217,6 +223,14 @@ namespace WaveHarmonic.Crest.Editor.Build
}
}
if (!RenderPipelineHelper.IsLegacy)
{
if (shader.name.StartsWithNoAlloc("Hidden/Crest/Legacy/"))
{
return true;
}
}
return false;
}
@@ -273,8 +287,8 @@ namespace WaveHarmonic.Crest.Editor.Build
return false;
}
// There will be at least three sub-shaders if one per render pipeline.
if (shader.subshaderCount <= 2)
// There will be at least two sub-shaders if other render pipelines.
if (shader.subshaderCount <= 1)
{
return false;
}