GameTech/URP 渲染实战
源码 / Ch11/Editor/MyPBRVariantCheck.cs
Ch11/Editor/MyPBRVariantCheck.cs
// 菜单:Cookbook/Ch11/Check MyPBR Variants —— 用几组典型关键字组合强制编译 MyPBR 的每个 Pass,
// 提前发现“默认变体能编过、某个开关一开就报错”的问题(光照贴图、调试视图、逐顶点光等)。
using System.Linq;
using UnityEditor;
using UnityEditor.Rendering;
using UnityEngine;

namespace Cookbook.Ch11
{
    public static class MyPBRVariantCheck
    {
        static readonly string[][] Sets =
        {
            new[] { "_NORMALMAP", "_MASKMAP", "_EMISSION", "_DFG_LUT", "_ALPHATEST_ON" },
            new[] { "LIGHTMAP_ON", "DIRLIGHTMAP_COMBINED", "SHADOWS_SHADOWMASK", "LIGHTMAP_SHADOW_MIXING", "_MAIN_LIGHT_SHADOWS_CASCADE" },
            new[] { "_ADDITIONAL_LIGHTS_VERTEX", "EVALUATE_SH_VERTEX", "_MAIN_LIGHT_SHADOWS_SCREEN", "_NORMALMAP" },
            new[] { "DEBUG_DISPLAY", "_ADDITIONAL_LIGHTS", "_FORWARD_PLUS", "_REFLECTION_PROBE_BLENDING", "_REFLECTION_PROBE_BOX_PROJECTION" },
            new[] { "_ADDITIONAL_LIGHTS", "_ADDITIONAL_LIGHT_SHADOWS", "_SHADOWS_SOFT_HIGH", "_LIGHT_LAYERS", "_LIGHT_COOKIES", "_SCREEN_SPACE_OCCLUSION", "EVALUATE_SH_MIXED" },
            new[] { "_WRITE_RENDERING_LAYERS", "_CASTING_PUNCTUAL_LIGHT_SHADOW", "EDITOR_VISUALIZATION", "_MASKMAP", "_EMISSION" },
        };

        [MenuItem("Cookbook/Ch11/Check MyPBR Variants")]
        public static int Check()
        {
            var sh = Shader.Find("Cookbook/Ch11/MyPBR");
            int errors = 0;
            foreach (var set in Sets)
            {
                var m = new Material(sh);
                foreach (var k in set) m.EnableKeyword(k);
                for (int p = 0; p < m.passCount; p++) ShaderUtil.CompilePass(m, p, true);
                Object.DestroyImmediate(m);
            }
            foreach (var msg in ShaderUtil.GetShaderMessages(sh).Where(x => x.severity == ShaderCompilerMessageSeverity.Error))
            {
                Debug.LogError($"[MyPBR variant] {msg.message} {msg.messageDetails} line {msg.line}");
                errors++;
            }
            Debug.Log($"[MyPBR variant] checked {Sets.Length} keyword sets, errors = {errors}");
            return errors;
        }
    }
}