Shader变体(Shader Variants)是什么?


两种变体

multi_compile

强制编译所有组合:无论是否使用,声明中的所有变体组合都会被编译。

shader_feature

按需编译:仅编译材质实际使用的变体(依赖材质参数或Keywords设置)。

示例代码

GLSL
Shader "Custom/Example" {
    Properties {
        [Toggle(TOON)] _UseToon ("Toon Shading", Int) = 0
    }

    SubShader {
        Pass {
	        // 1. 使用multi_compile
	        #pragma multi_compile _ TOON
	        #pragma multi_compile TOON  // 缺少空变体"_"
	        // 2. 使用shader_feature
            #pragma shader_feature TOON
            #pragma shader_feature _ TOON

            #ifdef TOON
                // 卡通渲染逻辑
            #else
	            // 其他渲染逻辑
	        #endif
        }
    }
}
点击展开查看更多

解析

区别对比

特性 multi_compile shader_feature
编译策略 强制编译所有组合 按材质实际使用编译
包体影响 可能包含未使用变体 仅包含被引用的变体
运行时切换 支持(Material.EnableKeyword 支持,但需预编译进包
适用场景 全局/高频切换功能 材质级/低频切换功能
变体丢失风险 高(未引用的材质变体会被剔除)

优化变体数量


变体管理

  1. 变体收集
    • 方法:Edit > Project Settings > Graphics > Shader Stripping
    • 添加需保留的变体Keyword(仅对 shader_feature 生效)。
  2. 调试工具
    • 查看编译结果:在Shader Inspector点击 「Compile and Show Code」
    • 检查当前Keyword:ShaderVariantCollection 资源。
  3. 代码中切换Keyword
    CSHARP
    material.EnableKeyword("_TOON");  // 启用变体分支
    material.DisableKeyword("_CELLSHADING");
    点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E5%8F%98%E4%BD%93-shader-variants/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键