Unity 修改 Standard 材质的渲染模式
觉得 Unity 有些地方提供的文档少之又少,比如 shader 里面,有些预定义的宏、关键字什么的,我想看一下全部的文档,在网上搜却找不到。
Standard 材质,在 inspector 面板上有个 Rendering Mode,它有如下这些枚举值可以选择:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。- Opaque:不透明
- Cutout:Alpha剔除、镂空
- Fade:半透明(使用了经典的 alpha 混合公式)
- Transparent:另一种半透明(据说支持 PBR)
虽然在 inspector 面板上可以很方便的指定,但在程序里想要动态切换却不知道这个 Rendering Mode 在材质里的属性名字是什么,Unity 不知为什么不提供这方面的文档,至少我是没有搜到。
以下来自网络。
这个 Rendering Mode 在材质里的属性名字就是 _Mode
4个枚举值可以自己定义,不必指定每个值,按顺序、默认就好(也就是 Opaque 为0)
1 enum RenderingMode 2 { 3 Opaque, 4 Cutout, 5 Fade, 6 Transparent 7 } 8 9 // mat 必须是个 Unity Standard 材质,否则设置不存在的属性会抛出异常 10 void setMaterialRenderingMode(Material mat, RenderingMode mode) 11 { 12 mat.SetFloat("_Mode", (float)mode); 13 14 int srcBlend, dstBlend, zwrite; 15 bool alphaTest, alphaBlend, alphaPreMul; 16 int renderQueue; 17 18 switch(mode) 19 { 20 case RenderingMode.Opaque: 21 srcBlend = UnityEngine.Rendering.BlendMode.One; 22 dstBlend = UnityEngine.Rendering.BlendMode.Zero; 23 zwrite = 1; 24 alphaTest = false; 25 alphaBlend = false; 26 alphaPreMul = false; 27 renderQueue = -1; 28 break; 29 30 case RenderingMode.Cutout: 31 srcBlend = UnityEngine.Rendering.BlendMode.One; 32 dstBlend = UnityEngine.Rendering.BlendMode.Zero; 33 zwrite = 1; 34 alphaTest = true; 35 alphaBlend = false; 36 alphaPreMul = false; 37 renderQueue = 2450; 38 break; 39 40 case RenderingMode.Fade: 41 srcBlend = UnityEngine.Rendering.BlendMode.SrcAlpha; 42 dstBlend = UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha; 43 zwrite = 0; 44 alphaTest = false; 45 alphaBlend = true; 46 alphaPreMul = false; 47 renderQueue = 3000; 48 break; 49 50 case RenderingMode.Transparent: 51 srcBlend = UnityEngine.Rendering.BlendMode.One; 52 dstBlend = UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha; 53 zwrite = 0; 54 alphaTest = false; 55 alphaBlend = false; 56 alphaPreMul = true; 57 renderQueue = 3000; 58 break; 59 } 60 61 mat.SetInt("_SrcBlend", srcBlend); 62 mat.SetInt("_DstBlend", dstBlend); 63 mat.SetInt("_ZWrite", zwrite ); 64 if(alphaTest) mat.EnableKeyword("_ALPHATEST_ON"); 65 else mat.DisableKeyword("_ALPHATEST_ON"); 66 if(alphaBlend) mat.EnableKeyword("_ALPHABLEND_ON"); 67 else mat.DisableKeyword("_ALPHABLEND_ON"); 68 if(alphaPreMul) mat.EnableKeyword("_ALPHAPREMULTIPLY_ON"); 69 else mat.DisableKeyword("_ALPHAPREMULTIPLY_ON"); 70 mat.renderQueue = renderQueue; 71 }

更多精彩