MaterialPropertyBlock
在unity中,有这样一种情形,有许多的物体,都使用了相同的材质球,但是呢,具体的细节又有些微的不同,如果想要些微的改变每一个 网格的颜色,改变 渲染状态是不行的。
这时,就可以使用MaterialPropertyBlock这个API。这个类将被传递给 Graphics.DrawMesh 或者Renderer.SetPropertyBlock,所以说,最高效的使用方式是创造一个block,然后在每一个网格 绘制 调用中复用。
如果要改变颜色,那么可以使用 MaterialPropertyBlock.SetColor(string name,Color value)。
需要注意的是,这里的value参数是 sRGB格式,并且如果激活颜色空间是线性的,那么这个值也会转换为线性的。如果你在不同的颜色格式中设置值,那么你需要手动转换。
1 using UnityEngine; 2 3 // Draws 3 meshes with the same material but with different colors. 4 public class ExampleClass : MonoBehaviour 5 { 6 public Mesh mesh; 7 public Material material; 8 private MaterialPropertyBlock block; 9 private int colorID; 10 11 void Start() 12 { 13 block = new MaterialPropertyBlock(); 14 colorID = Shader.PropertyToID("_Color"); 15 } 16 17 void Update() 18 { 19 // red mesh 20 block.SetColor(colorID, Color.red); 21 Graphics.DrawMesh(mesh, new Vector3(0, 0, 0), Quaternion.identity, material, 0, null, 0, block); 22 23 // green mesh 24 block.SetColor(colorID, Color.green); 25 Graphics.DrawMesh(mesh, new Vector3(5, 0, 0), Quaternion.identity, material, 0, null, 0, block); 26 27 // blue mesh 28 block.SetColor(colorID, Color.blue); 29 Graphics.DrawMesh(mesh, new Vector3(-5, 0, 0), Quaternion.identity, material, 0, null, 0, block); 30 } 31 }