public bool KeepVariantByConfigure(Shader shader, ShaderSnippetData snippet, ShaderCompilerData shaderVariant) { List <ShaderVariantsStripperFilter> filters = ShaderVariantsStripperConfigure.Configure.GetFilterList(); if (shader.name == "LDJ/Standard") { Debug.Log("ss"); } bool result = true; foreach (var filter in filters) { int filterresult = 0; //着色器名称 if ((filter.mask & MatchLayer.Shader) == MatchLayer.Shader) { // MatchLayer.Shader is allowed... int ret = filter.shaderName == shader.name ? (int)(MatchLayer.Shader) : 0; filterresult |= ret; } //着色器类型 if ((filter.mask & MatchLayer.ShaderType) == MatchLayer.ShaderType) { StripShaderType shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType); int ret = ((filter.shaderType & shaderType) == shaderType) ? (int)(MatchLayer.ShaderType) : 0; filterresult |= ret; } //passType if ((filter.mask & MatchLayer.PassType) == MatchLayer.PassType) { StripPassType passType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType); int ret = ((filter.passType & passType) == passType) ? (int)(MatchLayer.PassType) : 0; filterresult |= ret; } //shaderCompilerPlatform if ((filter.mask & MatchLayer.ShaderCompilerPlatform) == MatchLayer.ShaderCompilerPlatform) { StripShaderCompilerPlatform shaderCompilerPlatform = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.shaderCompilerPlatform); int ret = ((filter.shaderCompilerPlatform & shaderCompilerPlatform) == shaderCompilerPlatform) ? (int)(MatchLayer.ShaderCompilerPlatform) : 0; filterresult |= ret; } //GraphicsTier if ((filter.mask & MatchLayer.GraphicsTier) == MatchLayer.GraphicsTier) { StripGraphicsTier graphicsTier = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.graphicsTier); int ret = ((filter.graphicsTier & graphicsTier) == graphicsTier) ? (int)(MatchLayer.GraphicsTier) : 0; filterresult |= ret; } //builtinShaderDefine 黑名单有任意一种enable 就认为不通过 if ((filter.mask & MatchLayer.BuiltinShaderDefine) == MatchLayer.BuiltinShaderDefine) { UnityEngine.Rendering.BuiltinShaderDefine[] builtinShaderDefine = StripTypeConvert.ConvertStripTypeToUnityTypes(filter.builtinShaderDefine); bool has = false; for (int i = 0; i < builtinShaderDefine.Length; i++) { if (shaderVariant.platformKeywordSet.IsEnabled(builtinShaderDefine[i])) { has = true; break; } } int ret = has ? (int)(MatchLayer.BuiltinShaderDefine) : 0; filterresult |= ret; } //ShaderRequirements if ((filter.mask & MatchLayer.ShaderRequirements) == MatchLayer.ShaderRequirements) { int ret = (filter.shaderRequirements & shaderVariant.shaderRequirements) == filter.shaderRequirements ? (int)(MatchLayer.ShaderRequirements) : 0; filterresult |= ret; } //Keywords if ((filter.mask & MatchLayer.Keywords) == MatchLayer.Keywords) { //使用黑名单中的任意一个就剔除 bool ret = false; foreach (var key in filter.keywords) { ShaderKeyword shaderKeyword = new ShaderKeyword(key); ret = ret || shaderVariant.shaderKeywordSet.IsEnabled(shaderKeyword); if (ret) { break; } } int bitret = ret ? (int)(MatchLayer.Keywords) : 0; filterresult |= bitret; } if (((int)filter.mask & filterresult) == (int)filter.mask) { result = false; break; } else { continue; } } return(result); }
public StripShaderSnippetData(UnityEditor.Rendering.ShaderSnippetData snippet) { shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType); passType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType); passName = snippet.passName; }
public bool KeepVariantByWhitelist(Shader shader, ShaderSnippetData snippet, ShaderCompilerData shaderVariant) { List <ShaderVariantsStripperFilter> filters = ShaderVariantsStripperConfigure.Configure.GetFilterList(); bool result = false; foreach (var filter in filters) { int filterresult = 0; //着色器名称 if ((filter.mask & MatchLayer.Shader) == MatchLayer.Shader) { int ret = filter.shaderName == shader.name ? (int)(MatchLayer.Shader) : 0; //须要匹配名称 当前过滤条件的名称不符 跳过 if (ret == 0) { continue; } filterresult |= ret; } //着色器类型 if ((filter.mask & MatchLayer.ShaderType) == MatchLayer.ShaderType) { StripShaderType shaderType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.shaderType); int ret = ((filter.shaderType & shaderType) == shaderType) ? (int)(MatchLayer.ShaderType) : 0; filterresult |= ret; } //passType if ((filter.mask & MatchLayer.PassType) == MatchLayer.PassType) { StripPassType passType = StripTypeConvert.ConvertUnityTypeToStripType(snippet.passType); int ret = ((filter.passType & passType) == passType) ? (int)(MatchLayer.PassType) : 0; filterresult |= ret; } //shaderCompilerPlatform if ((filter.mask & MatchLayer.ShaderCompilerPlatform) == MatchLayer.ShaderCompilerPlatform) { StripShaderCompilerPlatform shaderCompilerPlatform = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.shaderCompilerPlatform); int ret = ((filter.shaderCompilerPlatform & shaderCompilerPlatform) == shaderCompilerPlatform) ? (int)(MatchLayer.ShaderCompilerPlatform) : 0; filterresult |= ret; } //GraphicsTier if ((filter.mask & MatchLayer.GraphicsTier) == MatchLayer.GraphicsTier) { StripGraphicsTier graphicsTier = StripTypeConvert.ConvertUnityTypeToStripType(shaderVariant.graphicsTier); int ret = ((filter.graphicsTier & graphicsTier) == graphicsTier) ? (int)(MatchLayer.GraphicsTier) : 0; filterresult |= ret; } //builtinShaderDefine if ((filter.mask & MatchLayer.BuiltinShaderDefine) == MatchLayer.BuiltinShaderDefine) { //所有enable的key 有一个不在列表里的 就认为不通过 UnityEngine.Rendering.BuiltinShaderDefine[] builtinShaderDefine = StripTypeConvert.ConvertStripTypeToUnityTypes(filter.builtinShaderDefine); List <UnityEngine.Rendering.BuiltinShaderDefine> enableList = new List <UnityEngine.Rendering.BuiltinShaderDefine>(builtinShaderDefine); bool through = true; Array array = Enum.GetValues(typeof(UnityEngine.Rendering.BuiltinShaderDefine)); foreach (UnityEngine.Rendering.BuiltinShaderDefine v in array) { if (shaderVariant.platformKeywordSet.IsEnabled(v)) { if (!enableList.Contains(v)) { through = false; break; } } } int ret = through ? (int)(MatchLayer.BuiltinShaderDefine) : 0; filterresult |= ret; } //ShaderRequirements if ((filter.mask & MatchLayer.ShaderRequirements) == MatchLayer.ShaderRequirements) { int ret = (filter.shaderRequirements & shaderVariant.shaderRequirements) == filter.shaderRequirements ? (int)(MatchLayer.ShaderRequirements) : 0; filterresult |= ret; } //Keywords if ((filter.mask & MatchLayer.Keywords) == MatchLayer.Keywords) { bool ret = true; //当前变体用到的key ShaderKeyword[] allkeys = shaderVariant.shaderKeywordSet.GetShaderKeywords(); foreach (ShaderKeyword akey in allkeys) { bool enable = shaderVariant.shaderKeywordSet.IsEnabled(akey); if (enable) { string keyWordName = akey.GetKeywordName(); #if UNITY_2018_3_OR_NEWER keyWordName = akey.GetKeywordName(); #else keyWordName = akey.GetName(); #endif bool include = filter.keywords.Contains(keyWordName); ret = ret && include; //使用了过滤名单以外的自定义key 跳出for 剔除变体 if (ret == false) { break; } } else { continue; } } int bitret = ret ? (int)(MatchLayer.Keywords) : 0; filterresult |= bitret; } //有一个通过就是保留的 if (((int)filter.mask & filterresult) == (int)filter.mask) { result = true; break; } } return(result); }