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 }

 

posted @ 2018-05-31 10:43  gameDesigner  阅读(1100)  评论(0编辑  收藏  举报