觉得 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 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄