Unity #pragma multi_compile说明

Posted nafio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity #pragma multi_compile说明相关的知识,希望对你有一定的参考价值。

https://blog.csdn.net/ak47007tiger/article/details/100007655

multi_compile

  • 作用
    • 根据编译选项产生shader变体
    • 避免分支语句导致的性能下降
    • 主要用于在代码中选择shader变体
  • Unity在打包时会把所有multi_compile产生的shader变体都打进包中

技术图片

技术图片

 

示例shader

Shader "DC/Shader/ShaderLab/MultiCompile"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [KeywordEnum(R,G,B)] _CL("ColorSelect", Float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #pragma multi_compile _CL_R _CL_G _CL_B
            //使用 __ 减少一个编译选项,编译选项最多256个
            #pragma multi_compile __ DB_ON

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                #if DB_ON
                    return fixed4(1,1,0,1);
                #elif _CL_R
                    return fixed4(1,0,0,1);
                #elif _CL_G
                    return fixed4(0,1,0,1);
                #elif _CL_B
                    return fixed4(0,0,1,1);
                #else
                    fixed4 col = tex2D(_MainTex, i.uv);
                    return col;
                #endif
            }
            ENDCG
        }
    }
}

  示例脚本

using UnityEngine;

namespace DC
{
  public class MultiCompile : MonoBehaviour
  {
    public Material mat;

    public void OnEnable()
    {
      mat.EnableKeyword("DB_ON");
//      Shader.EnableKeyword("ON");
    }

    public void OnDisable()
    {
      mat.DisableKeyword("DB_ON");
//      Shader.DisableKeyword("DB_ON");
    }
  }
}

  

 

以上是关于Unity #pragma multi_compile说明的主要内容,如果未能解决你的问题,请参考以下文章

如何用unity3D shader修改渲染设置 使空缺贴图显示透明而不是白色

Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器

#pragma 标记的意义​​是啥?为啥我们需要#pragma 标记?

#pragma 警告(push) 没有 #pragma 警告(pop)

#pragma使用分析

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()