コード例 #1
0
        public BaseShaderPreprocessor()
        {
            // NOTE: All these keyword should be automatically stripped so there's no need to handle them ourselves.
            // LIGHTMAP_ON, DIRLIGHTMAP_COMBINED, DYNAMICLIGHTMAP_ON, LIGHTMAP_SHADOW_MIXING, SHADOWS_SHADOWMASK
            // FOG_LINEAR, FOG_EXP, FOG_EXP2
            // STEREO_INSTANCING_ON, STEREO_MULTIVIEW_ON, STEREO_CUBEMAP_RENDER_ON, UNITY_SINGLE_PASS_STEREO
            // INSTANCING_ON
            m_Transparent          = new ShaderKeyword("_SURFACE_TYPE_TRANSPARENT");
            m_DebugDisplay         = new ShaderKeyword("DEBUG_DISPLAY");
            m_TileLighting         = new ShaderKeyword("USE_FPTL_LIGHTLIST");
            m_ClusterLighting      = new ShaderKeyword("USE_CLUSTERED_LIGHTLIST");
            m_LodFadeCrossFade     = new ShaderKeyword("LOD_FADE_CROSSFADE");
            m_DecalsOFF            = new ShaderKeyword("DECALS_OFF");
            m_Decals3RT            = new ShaderKeyword("DECALS_3RT");
            m_Decals4RT            = new ShaderKeyword("DECALS_4RT");
            m_LightLayers          = new ShaderKeyword("LIGHT_LAYERS");
            m_ShadowLow            = new ShaderKeyword("SHADOW_LOW");
            m_ShadowMedium         = new ShaderKeyword("SHADOW_MEDIUM");
            m_ShadowHigh           = new ShaderKeyword("SHADOW_HIGH");
            m_WriteNormalBuffer    = new ShaderKeyword("WRITE_NORMAL_BUFFER");
            m_WriteMSAADepth       = new ShaderKeyword("WRITE_MSAA_DEPTH");
            m_SubsurfaceScattering = new ShaderKeyword("OUTPUT_SPLIT_LIGHTING");

            m_ShadowVariants = new Dictionary <HDShadowQuality, ShaderKeyword>
            {
                { HDShadowQuality.Low, m_ShadowLow },
                { HDShadowQuality.Medium, m_ShadowMedium },
                { HDShadowQuality.High, m_ShadowHigh },
            };
        }
コード例 #2
0
            public ShaderVariantsInfo(Shader sh, PassType pass, string[] words)
            {
                int wordsLength = 0;

                if (words != null)
                {
                    wordsLength = words.Length;
                }
                this.shader       = sh;
                this.passType     = pass;
                this.keywords     = words;
                this.keywordInfos = new List <ShaderKeyword>(wordsLength);
                for (int i = 0; i < wordsLength; ++i)
                {
                    if (string.IsNullOrEmpty(words[i]))
                    {
                        continue;
                    }
                    ShaderKeyword shKeyword = new ShaderKeyword(sh, words[i]);
                    keywordInfos.Add(shKeyword);
                }
                keywordsForCheck = new List <string>();
                foreach (var keywordInfo in keywordInfos)
                {
                    if (!string.IsNullOrEmpty(ShaderKeyword.GetKeywordName(sh, keywordInfo)) &&
                        ShaderKeyword.GetKeywordType(sh, keywordInfo) != ShaderKeywordType.BuiltinDefault)
                    {
                        keywordsForCheck.Add(ShaderKeyword.GetKeywordName(sh, keywordInfo));
                    }
                }
                keywordsForCheck.Sort();
            }
コード例 #3
0
 private string[] GetExistingShaderKeywords(Shader shader, IList <ShaderCompilerData> data)
 {
     return(data.SelectMany(d => d.shaderKeywordSet.GetShaderKeywords())
            .Where(k => ShaderKeyword.IsKeywordLocal(k))
            .Select(k => ShaderKeyword.GetKeywordName(shader, k))
            .Where(kwd => WFCommonUtility.IsEnableKeyword(kwd)).Distinct().ToArray());
 }
    private void AppendShaderInfo(StringBuilder sb, Shader shader, ShaderSnippetData snippet, ShaderCompilerData compilerData)
    {
        if (sb.Length == 0)
        {
            sb.Append("Shader:" + shader.name).Append("\n");
            sb.Append("ShaderType:").Append(snippet.shaderType).Append("\n").
            Append("PassName:").Append(snippet.passName).Append("\n").
            Append("PassType:").Append(snippet.passType).Append("\n\n");
        }

        var keywords = compilerData.shaderKeywordSet.GetShaderKeywords();

        var sortKeywords = new ShaderKeyword[keywords.Length];

        for (int i = 0; i < keywords.Length; ++i)
        {
            sortKeywords[i] = keywords[i];
        }
        System.Array.Sort(sortKeywords, new SortShaderKeyword());
        sb.Append(" Keyword:");
        foreach (var keyword in sortKeywords)
        {
            sb.Append(keyword.GetKeywordName()).Append(" ");
        }
        sb.Append("\n KeywordType:");
        foreach (var keyword in sortKeywords)
        {
            sb.Append(keyword.GetKeywordType()).Append(" ");
        }
        sb.Append("\n").Append("\n");
    }
        public ShaderVariantsInfo(Shader sh, PassType pass, string[] words)
        {
            this.shader       = sh;
            this.passType     = pass;
            this.keywords     = words;
            this.keywordInfos = new List <ShaderKeyword>(words.Length);
            for (int i = 0; i < words.Length; ++i)
            {
                if (string.IsNullOrEmpty(words[i]))
                {
                    continue;
                }
#if UNITY_2019 || UNITY_2019_3_OR_NEWER
                ShaderKeyword shKeyword = new ShaderKeyword(sh, words[i]);
#else
                ShaderKeyword shKeyword = new ShaderKeyword(words[i]);
#endif
                keywordInfos.Add(shKeyword);
            }
            keywordsForCheck = new List <string>();
            foreach (var keywordInfo in keywordInfos)
            {
                if (!string.IsNullOrEmpty(keywordInfo.GetKeywordName()) &&
                    keywordInfo.GetKeywordType() != ShaderKeywordType.BuiltinAutoStripped)
                {
                    keywordsForCheck.Add(keywordInfo.GetKeywordName());
                }
            }
            keywordsForCheck.Sort();
        }
コード例 #6
0
        public bool KeepVariants(Shader shader, ShaderSnippetData snippet, ShaderCompilerData variants)
        {
            keywords.Clear();
            var shaderKeywords = variants.shaderKeywordSet.GetShaderKeywords();

            foreach (var shaderkeyword in shaderKeywords)
            {
                keywords.Add(ShaderKeyword.GetGlobalKeywordName(shaderkeyword));
            }
            bool hasKeywords = keywords.Count > 0;

            Debug.Log(shader.name + "\tVariants:" + (hasKeywords ? string.Join("\t", keywords.ToArray()) : "<no keywords>"));

            if (hasKeywords && keepExportVariants != null)
            {
                ShaderVariant shaderVariant = new ShaderVariant(shader, snippet.passType, keywords.ToArray());
                // 必须,自动导出的变体组合
                if (keepExportVariants.Contains(shaderVariant))
                {
                    return(true);
                }
                // 可选,自定义变体组合
                if (keepCustomVariants != null && keepCustomVariants.Contains(shaderVariant))
                {
                    return(true);
                }
                return(false);
            }
            return(true);
        }
コード例 #7
0
        void BuildEnumKeywordField(PropertySheet propertySheet, ShaderKeyword keyword)
        {
            // Clamp value between entry list
            int value = Mathf.Clamp(keyword.value, 0, keyword.entries.Count - 1);

            // Default field
            var field = new PopupField <string>(keyword.entries.Select(x => x.displayName).ToList(), value);

            field.RegisterValueChangedCallback(evt =>
            {
                this._preChangeValueCallback("Change Keyword Value");
                keyword.value = field.index;
                this._postChangeValueCallback(false, ModificationScope.Graph);
            });

            AddPropertyRowToSheet(propertySheet, field, "Default");

            // Entries
            var container = new IMGUIContainer(() => OnKeywordGUIHandler())
            {
                name = "ListContainer"
            };

            AddPropertyRowToSheet(propertySheet, container, "Entries");
            container.SetEnabled(!keyword.isBuiltIn);
        }
コード例 #8
0
 void InitializeLocalShaderKeywords(Shader shader)
 {
     m_LocalDetailMulx2  = new ShaderKeyword(shader, ShaderKeywordStrings._DETAIL_MULX2);
     m_LocalDetailScaled = new ShaderKeyword(shader, ShaderKeywordStrings._DETAIL_SCALED);
     m_LocalClearCoat    = new ShaderKeyword(shader, ShaderKeywordStrings._CLEARCOAT);
     m_LocalClearCoatMap = new ShaderKeyword(shader, ShaderKeywordStrings._CLEARCOATMAP);
 }
コード例 #9
0
 public BaseShaderPreprocessor()
 {
     // NOTE: All these keyword should be automatically stripped so there's no need to handle them ourselves.
     // LIGHTMAP_ON, DIRLIGHTMAP_COMBINED, DYNAMICLIGHTMAP_ON, LIGHTMAP_SHADOW_MIXING, SHADOWS_SHADOWMASK
     // FOG_LINEAR, FOG_EXP, FOG_EXP2
     // STEREO_INSTANCING_ON, STEREO_MULTIVIEW_ON, STEREO_CUBEMAP_RENDER_ON, UNITY_SINGLE_PASS_STEREO
     // INSTANCING_ON
     m_Transparent                  = new ShaderKeyword("_SURFACE_TYPE_TRANSPARENT");
     m_AlphaTestOn                  = new ShaderKeyword("_ALPHATEST_ON");
     m_DebugDisplay                 = new ShaderKeyword("DEBUG_DISPLAY");
     m_TileLighting                 = new ShaderKeyword("USE_FPTL_LIGHTLIST");
     m_ClusterLighting              = new ShaderKeyword("USE_CLUSTERED_LIGHTLIST");
     m_LodFadeCrossFade             = new ShaderKeyword("LOD_FADE_CROSSFADE");
     m_DecalsOFF                    = new ShaderKeyword("DECALS_OFF");
     m_Decals3RT                    = new ShaderKeyword("DECALS_3RT");
     m_Decals4RT                    = new ShaderKeyword("DECALS_4RT");
     m_LightLayers                  = new ShaderKeyword("LIGHT_LAYERS");
     m_WriteNormalBuffer            = new ShaderKeyword("WRITE_NORMAL_BUFFER");
     m_WriteDecalBuffer             = new ShaderKeyword("WRITE_DECAL_BUFFER");
     m_WriteMSAADepth               = new ShaderKeyword("WRITE_MSAA_DEPTH");
     m_SubsurfaceScattering         = new ShaderKeyword("OUTPUT_SPLIT_LIGHTING");
     m_ScreenSpaceShadowOFFKeywords = new ShaderKeyword("SCREEN_SPACE_SHADOWS_OFF");
     m_ScreenSpaceShadowONKeywords  = new ShaderKeyword("SCREEN_SPACE_SHADOWS_ON");
     m_ProbeVolumesL1               = new ShaderKeyword("PROBE_VOLUMES_L1");
     m_ProbeVolumesL2               = new ShaderKeyword("PROBE_VOLUMES_L2");
     m_DecalSurfaceGradient         = new ShaderKeyword("DECAL_SURFACE_GRADIENT");
     m_EditorVisualization          = new ShaderKeyword("EDITOR_VISUALIZATION");
     m_ShadowKeywords               = new ShadowKeywords();
 }
 public BaseShaderPreprocessor()
 {
     m_Transparent     = new ShaderKeyword("_SURFACE_TYPE_TRANSPARENT");
     m_DebugDisplay    = new ShaderKeyword("DEBUG_DISPLAY");
     m_TileLighting    = new ShaderKeyword("USE_FPTL_LIGHTLIST");
     m_ClusterLighting = new ShaderKeyword("USE_CLUSTERED_LIGHTLIST");
 }
コード例 #11
0
 private string GetKeywordName(Shader shader, ShaderKeyword keyword)
 {
     #if UNITY_2021_2_OR_NEWER
     return(keyword.name);
                 #else
     return(ShaderKeyword.GetKeywordName(shader, keyword));
                 #endif
 }
コード例 #12
0
 public static string GetKeywordName(ShaderKeyword k)
 {
                 #if UNITY_2018_3_OR_NEWER
     return(k.GetKeywordName());
                 #else
     return( = k.GetName());
                 #endif
 }
コード例 #13
0
        public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList <ShaderCompilerData> data)
        {
            Debug.Log($"Before Shader {shader.name} --> {data.Count}");
            if (!m_shaderKeywordCollector.TryGetValue(shader, out var collectKeywords))
            {
                if (m_shaderKeywordCollector.Count == 0)
                {
                    return;
                }

                data.Clear();
                Debug.Log($"Shader {shader.name} --> {data.Count}");
                return;
            }

            for (int i = data.Count - 1; i >= 0; i--)
            {
                var compilerData = data[i];
                var keywords     = compilerData.shaderKeywordSet.GetShaderKeywords();
                foreach (var shaderKeyword in keywords)
                {
                    if (Array.IndexOf(STRIP_BUILD_IN_KEYWORDS, shaderKeyword) != -1)
                    {
                        data.RemoveAt(i);
                        break;
                    }

                    var keywordName = ShaderKeyword.GetKeywordName(shader, shaderKeyword);
                    if (!keywordName.StartsWith("_"))
                    {
                        if (!m_filteredBuildInKeywords.Contains(keywordName))
                        {
                            m_filteredBuildInKeywords.Add(keywordName);
                        }
                        continue;
                    }

                    bool inUsed = false;
                    foreach (var collectKeyword in collectKeywords)
                    {
                        if (collectKeyword.Contains(keywordName))
                        {
                            inUsed = true;
                            break;
                        }
                    }

                    if (!inUsed)
                    {
                        data.RemoveAt(i);
                        break;
                    }
                }
            }

            Debug.Log($"Shader {shader.name} --> {data.Count}");
        }
コード例 #14
0
        static string[] GetShaderKeywords(Shader shader, ShaderKeyword[] shaderKeywords)
        {
#if UNITY_2019_3_OR_NEWER
            var keywords = shaderKeywords.Select(keyword => ShaderKeyword.IsKeywordLocal(keyword) ? ShaderKeyword.GetKeywordName(shader, keyword) : ShaderKeyword.GetGlobalKeywordName(keyword)).ToArray();
#else
            var keywords = shaderKeywords.Select(keyword => keyword.GetKeywordName()).ToArray();
#endif
            return(keywords);
        }
コード例 #15
0
 void AddKeywordItems(GenericMenu gm)
 {
     gm.AddItem(new GUIContent($"Keyword/Boolean"), false, () => AddInputRow(new ShaderKeyword(KeywordType.Boolean), true));
     gm.AddItem(new GUIContent($"Keyword/Enum"), false, () => AddInputRow(new ShaderKeyword(KeywordType.Enum), true));
     gm.AddSeparator($"Keyword/");
     foreach (var builtinKeywordDescriptor in KeywordUtil.GetBuiltinKeywordDescriptors())
     {
         var keyword = ShaderKeyword.CreateBuiltInKeyword(builtinKeywordDescriptor);
         AddBuiltinKeyword(gm, keyword);
     }
 }
コード例 #16
0
 void AddBuiltinKeyword(GenericMenu gm, ShaderKeyword keyword)
 {
     if (m_Graph.keywords.Where(x => x.referenceName == keyword.referenceName).Any())
     {
         gm.AddDisabledItem(new GUIContent($"Keyword/{keyword.displayName}"));
     }
     else
     {
         gm.AddItem(new GUIContent($"Keyword/{keyword.displayName}"), false, () => AddInputRow(m_Graph.AddCopyOfShaderInput(keyword)));
     }
 }
コード例 #17
0
ファイル: KeywordTests.cs プロジェクト: torvall/Graphics
        public void KeywordEnumCanAddAndRemovePort()
        {
            ShaderKeyword enumAKeyword = m_Collector.keywords.Where(x => x.displayName == "Enum A").FirstOrDefault();
            ShaderKeyword enumBKeyword = m_Collector.keywords.Where(x => x.displayName == "Enum B").FirstOrDefault();

            if (enumAKeyword == null || enumBKeyword == null)
            {
                Assert.Fail("One or more Keywords not in graph.");
            }

            var         keywordNodes = m_Graph.GetNodes <KeywordNode>().ToList();
            KeywordNode enumANode    = keywordNodes.Where(x => x.keyword == enumAKeyword).FirstOrDefault();
            KeywordNode enumBNode    = keywordNodes.Where(x => x.keyword == enumBKeyword).FirstOrDefault();

            if (enumANode == null || enumBNode == null)
            {
                Assert.Fail("One or more Keywords Nodes not in graph.");
            }

            KeywordEntry newEntry1 = new KeywordEntry(4, "D", "D");
            KeywordEntry newEntry2 = new KeywordEntry(5, "E", "E");
            KeywordEntry newEntry3 = new KeywordEntry(6, "F", "F");
            KeywordEntry newEntry4 = new KeywordEntry(5, "E", "E");


            enumAKeyword.entries.Add(newEntry1);
            enumAKeyword.entries.Add(newEntry2);
            enumAKeyword.entries.Add(newEntry3);
            enumBKeyword.entries.Add(newEntry4);

            Assert.AreEqual(6, enumAKeyword.entries.Count, "Enum A Keyword has incorrect # of entries after adding");
            Assert.AreEqual(5, enumBKeyword.entries.Count, "Enum B Keyword has incorrect # of entries after adding");

            enumANode.UpdateNode();
            enumBNode.UpdateNode();

            Assert.AreEqual(7, enumANode.GetSlots <MaterialSlot>().Count(), "Enum A Node has incorrect # of entries after adding");
            Assert.AreEqual(6, enumBNode.GetSlots <MaterialSlot>().Count(), "Enum B Node has incorrect # of entries after adding");

            enumAKeyword.entries.Remove(newEntry1);
            enumAKeyword.entries.Remove(newEntry2);
            enumAKeyword.entries.Remove(newEntry3);
            enumBKeyword.entries.Remove(newEntry4);

            Assert.AreEqual(3, enumAKeyword.entries.Count, "Enum A Keyword has incorrect # of entries after removing");
            Assert.AreEqual(4, enumBKeyword.entries.Count, "Enum B Keyword has incorrect # of entries after removing");

            enumANode.UpdateNode();
            enumBNode.UpdateNode();

            Assert.AreEqual(4, enumANode.GetSlots <MaterialSlot>().Count(), "Enum A Node has incorrect # of entries after removing");
            Assert.AreEqual(5, enumBNode.GetSlots <MaterialSlot>().Count(), "Enum B Node has incorrect # of entries after removing");
        }
コード例 #18
0
        public override void BuildCustomFields(ShaderInput input)
        {
            m_Keyword = input as ShaderKeyword;
            if (m_Keyword == null)
            {
                return;
            }

            // KeywordDefinition
            var keywordDefinitionField = new EnumField((Enum)m_Keyword.keywordDefinition);

            keywordDefinitionField.RegisterValueChangedCallback(evt =>
            {
                graph.owner.RegisterCompleteObjectUndo("Change Keyword Type");
                if (m_Keyword.keywordDefinition == (KeywordDefinition)evt.newValue)
                {
                    return;
                }
                m_Keyword.keywordDefinition = (KeywordDefinition)evt.newValue;
                Rebuild();
            });
            AddRow("Definition", keywordDefinitionField, m_Keyword.isEditable);

            // KeywordScope
            if (m_Keyword.keywordDefinition != KeywordDefinition.Predefined)
            {
                var keywordScopeField = new EnumField((Enum)m_Keyword.keywordScope);
                keywordScopeField.RegisterValueChangedCallback(evt =>
                {
                    graph.owner.RegisterCompleteObjectUndo("Change Keyword Type");
                    if (m_Keyword.keywordScope == (KeywordScope)evt.newValue)
                    {
                        return;
                    }
                    m_Keyword.keywordScope = (KeywordScope)evt.newValue;
                });
                AddRow("Scope", keywordScopeField, m_Keyword.isEditable);
            }

            switch (m_Keyword.keywordType)
            {
            case KeywordType.Boolean:
                BuildBooleanKeywordField(m_Keyword);
                break;

            case KeywordType.Enum:
                BuildEnumKeywordField(m_Keyword);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #19
0
 public BaseShaderPreprocessor()
 {
     m_Transparent      = new ShaderKeyword("_SURFACE_TYPE_TRANSPARENT");
     m_DebugDisplay     = new ShaderKeyword("DEBUG_DISPLAY");
     m_TileLighting     = new ShaderKeyword("USE_FPTL_LIGHTLIST");
     m_ClusterLighting  = new ShaderKeyword("USE_CLUSTERED_LIGHTLIST");
     m_LodFadeCrossFade = new ShaderKeyword("LOD_FADE_CROSSFADE");
     m_DecalsOFF        = new ShaderKeyword("DECALS_OFF");
     m_Decals3RT        = new ShaderKeyword("DECALS_3RT");
     m_Decals4RT        = new ShaderKeyword("DECALS_4RT");
     m_LightLayers      = new ShaderKeyword("LIGHT_LAYERS");
 }
コード例 #20
0
 //判断字符串是那种关键字
 public static ShaderKeywordType GetKeywordType(string key)
 {
     try
     {
         ShaderKeyword shaderKeyword = new ShaderKeyword(key);
         return(shaderKeyword.GetKeywordType());
     }
     catch
     {
         return(ShaderKeywordType.None);
     }
 }
コード例 #21
0
        public ShadowKeywords()
        {
            ShadowLow    = new ShaderKeyword("SHADOW_LOW");
            ShadowMedium = new ShaderKeyword("SHADOW_MEDIUM");
            ShadowHigh   = new ShaderKeyword("SHADOW_HIGH");

            ShadowVariants = new Dictionary <HDShadowFilteringQuality, ShaderKeyword>
            {
                { HDShadowFilteringQuality.Low, ShadowLow },
                { HDShadowFilteringQuality.Medium, ShadowMedium },
                { HDShadowFilteringQuality.High, ShadowHigh },
            };
        }
コード例 #22
0
 protected override bool MatchVariant(ShaderCompilerData variantData)
 {
     for (int i = 0; i < _blacklistedKeywords.Count; ++i)
     {
         var s   = _blacklistedKeywords[i];
         var key = new ShaderKeyword(s);
         if (variantData.shaderKeywordSet.IsEnabled(key))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #23
0
        void BuildBooleanKeywordField(PropertySheet propertySheet, ShaderKeyword keyword)
        {
            var toggleDataPropertyDrawer = new ToggleDataPropertyDrawer();

            propertySheet.Add(toggleDataPropertyDrawer.CreateGUI(
                                  newValue =>
            {
                this._preChangeValueCallback("Change property value");
                keyword.value = newValue.isOn ? 1 : 0;
                this._postChangeValueCallback(false, ModificationScope.Graph);
            },
                                  new ToggleData(keyword.value == 1),
                                  "Default",
                                  out var boolKeywordField));
        }
コード例 #24
0
        private List <string> Convert(Shader shader, ShaderKeyword[] keywords)
        {
            List <string> converted = new List <string>(keywords.Length);

            for (int i = 0; i < keywords.Length; ++i)
            {
                if (!string.IsNullOrEmpty(ShaderKeyword.GetKeywordName(shader, keywords[i])) &&
                    ShaderKeyword.GetKeywordType(shader, keywords[i]) != ShaderKeywordType.BuiltinDefault)
                {
                    converted.Add(ShaderKeyword.GetKeywordName(shader, keywords[i]));
                }
            }
            converted.Sort();
            return(converted);
        }
コード例 #25
0
 protected override bool StripCustom(Shader shader, ShaderSnippetData passData, IList <ShaderCompilerData> variantData)
 {
     foreach (var d in variantData)
     {
         // Builtins
         foreach (var b in _forceBuiltins)
         {
             bool matched = d.platformKeywordSet.IsEnabled(b.defineToMatch);
             if (b.invertMatch)
             {
                 matched = !matched;
             }
             if (matched)
             {
                 if (b.invertForce)
                 {
                     d.platformKeywordSet.Disable(b.defineToForce);
                 }
                 else
                 {
                     d.platformKeywordSet.Enable(b.defineToForce);
                 }
             }
         }
         // Keywords
         foreach (var k in _forceKeywords)
         {
             bool matched = d.shaderKeywordSet.IsEnabled(new ShaderKeyword(k.keywordToMatch));
             if (k.invertMatch)
             {
                 matched = !matched;
             }
             if (matched)
             {
                 ShaderKeyword sk = new ShaderKeyword(k.keywordToForce);
                 if (k.invertForce)
                 {
                     d.shaderKeywordSet.Disable(sk);
                 }
                 else
                 {
                     d.shaderKeywordSet.Enable(sk);
                 }
             }
         }
     }
     return(true);
 }
    public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList <ShaderCompilerData> data)
    {
        return;

        if (shader.name != "MJ/Test_shaderfeature")
        {
            return;
        }

        // 只处理 vertex 和 fragment lit.shad阶段 //
        List <string> kwToKeep = null;

        if (snippet.shaderType == ShaderType.Vertex)
        {
            kwToKeep = KeyworsToKeep_VP;
        }
        else if (snippet.shaderType == ShaderType.Fragment)
        {
            kwToKeep = KeyworsToKeep_FP;
        }

        if (kwToKeep == null)
        {
            return;
        }

        for (int i = data.Count - 1; i >= 0; i--)
        {
            ShaderCompilerData scd = data[i];

            bool neesStrip = false;

            for (int j = 0; j < kwToKeep.Count; j++)
            {
                ShaderKeyword kw = new ShaderKeyword(kwToKeep[j]);
                if (!scd.shaderKeywordSet.IsEnabled(kw))
                {
                    neesStrip = true;
                    break;
                }
            }

            if (neesStrip)
            {
                data.RemoveAt(i);
            }
        }
    }
コード例 #27
0
        private void StripKeyword(ShaderKeyword keyword, ref IList <ShaderCompilerData> compilerDataList, ref int i, ShaderSnippetData snippet, bool condition = true)
        {
            if (condition && compilerDataList[i].shaderKeywordSet.IsEnabled(keyword))
            {
                compilerDataList.RemoveAt(i);
                --i;

                #if ENABLE_SHADER_STRIPPING_LOG && !ENABLE_DEEP_STRIPPING_LOG
                Debug.Log("Stripped " + GetKeywordName(waterShader, keyword));
                #endif

                                #if ENABLE_DEEP_STRIPPING_LOG
                File.AppendAllText(LOG_FILEPATH, "- " + $"Stripped {GetKeywordName(waterShader, keyword)} variant from pass {snippet.passName} (stage: {snippet.shaderType})" + "\n");
                                #endif
            }
        }
コード例 #28
0
        void BuildBooleanKeywordField(ShaderKeyword keyword)
        {
            // Default field
            var field = new Toggle()
            {
                value = keyword.value == 1
            };

            field.OnToggleChanged(evt =>
            {
                graph.owner.RegisterCompleteObjectUndo("Change property value");
                keyword.value = evt.newValue ? 1 : 0;
                DirtyNodes(ModificationScope.Graph);
            });
            AddRow("Default", field);
        }
コード例 #29
0
        public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList <ShaderCompilerData> data)
        {
            if (!UPRToolSetting.Instance.enableShaderVariantsCheck)
            {
                return;
            }

            if (snippet.shaderType != ShaderType.Fragment)
            {
                return;
            }

            var shaderName = shader.name;

            if (!s_ShaderNames.Contains(shaderName))
            {
                return;
            }
            if (!s_ShaderReports.ContainsKey(shaderName))
            {
                s_ShaderReports.Add(shaderName, new List <ShaderVariantsCheckResult>());
            }

            foreach (var shaderCompilerData in data)
            {
                var shaderKeywordSet = shaderCompilerData.shaderKeywordSet.GetShaderKeywords().ToArray();

#if UNITY_2019_3_OR_NEWER
                var keywords = shaderKeywordSet.Select(keyword =>
                                                       ShaderKeyword.IsKeywordLocal(keyword)
                        ? ShaderKeyword.GetKeywordName(shader, keyword)
                        : ShaderKeyword.GetGlobalKeywordName(keyword)).ToArray();
#else
                var keywords = shaderKeywordSet.Select(keyword => keyword.GetKeywordName()).ToArray();
#endif
                var keywordString = string.Join(", ", keywords);
                if (string.IsNullOrEmpty(keywordString))
                {
                    keywordString = "<no keywords>";
                }

                s_ShaderReports[shaderName].Add(new ShaderVariantsCheckResult(shaderName,
                                                                              shaderCompilerData.shaderCompilerPlatform.ToString(),
                                                                              shaderCompilerData.graphicsTier.ToString(), snippet.passName,
                                                                              keywordString));
            }
        }
コード例 #30
0
        /// <summary>
        /// 转换成Keywords
        /// </summary>
        private string[] ConvertToKeywords(ShaderKeywordSet shaderKeywordSet)
        {
            ShaderKeyword[] shaderKeywords = shaderKeywordSet.GetShaderKeywords();
            string[]        keywords       = new string[shaderKeywords.Length];
            for (int iKeyword = 0; iKeyword < shaderKeywords.Length; iKeyword++)
            {
                ShaderKeyword iterKeyword = shaderKeywords[iKeyword];
                keywords[iKeyword] =
#if UNITY_2019_1_OR_NEWER
                    ShaderKeyword.GetGlobalKeywordName(iterKeyword)
#else
                    m_KeywordNames[UnityEngineReflectionUtility.ShaderKeyword.GetShaderKeywordIndex(iterKeyword)]
#endif
                ;
            }
            return(keywords);
        }