Overrid Material就是在原本材质的基础上在覆盖一个新的,如果覆盖了这个材质就会绘制2次。如下图所示一般会添加一个层,在Filtering中不包含Actor层,这样渲染时就会过滤它。
如下图所示,添加一个新的渲染器,设置LayerMask为Actor层,下面在设置一个可覆盖的material材质,这样Actor层中所有的材质都会使用Overrid的这个材质进行渲染。
此时已经出了个大问题,立方体原本设置的材质贴图、颜色、等其他参数都变成统一的了,所以需要添加脚本动态将原本的参数赋值给新的OverridMaterial才行。
如下代码所示,通过MaterialPropertyBlock的方式将参数传递给新材质中,只要确保传递的这些参数在新材质Shader中的CBUFFER中极即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class NewBehaviourScript : MonoBehaviour { public Color color = Color.white; public Texture2D texture; void Awake() { Renderer renderer = GetComponent<Renderer>(); MaterialPropertyBlock block = new MaterialPropertyBlock(); renderer.GetPropertyBlock(block); block.SetTexture("_BaseMap", texture); block.SetColor("_BaseColor", color); renderer.SetPropertyBlock(block); } } |
1 2 3 4 5 6 7 |
TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap); CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; float4 _BaseColor; CBUFFER_END |
如下图所示,多个Actor层下的物体以不同的参数进行绘制OverridMaterial。
- 本文固定链接: https://www.xuanyusong.com/archives/4965
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!