1.7 C#传递参数给Shader

1.MaterialPropertyBlock

2.通过Material的Set方法

3.Shader全局属性(Global Shader Properties)


1.MaterialPropertyBlock

csharp 复制代码
运行时修改材质属性, 而不会创建新的材质实例(不会增加内存开销)
csharp 复制代码
private Renderer renderer;
private MaterialPropertyBlock propertyBlock;

void Start()
{
    renderer = GetComponent<Renderer>();
    propertyBlock = new MaterialPropertyBlock();
}

void Update()
{
    // 获取当前渲染器的属性块
    renderer.GetPropertyBlock(propertyBlock);
    // 设置颜色属性
    propertyBlock.SetColor("_Color", color);
    // 设置浮点数属性
    propertyBlock.SetFloat("_FloatValue", floatValue);
    // 将属性块应用回渲染器
    renderer.SetPropertyBlock(propertyBlock);
}

2.通过Material的Set方法

csharp 复制代码
这种方法会修改材质的属性, 如果材质是共享的, 那么所有使用该材质的对象都会受到影响; 如果不想影响其他对象, 可以

先复制一份材质(使用Material.Instantiate)
csharp 复制代码
private Material material;

void Start()
{
    // 获取渲染器上的材质,这里会创建一份新的材质实例(如果材质不是实例化的,则会实例化)
    Renderer renderer = GetComponent<Renderer>();
    // 使用material会创建实例,使用sharedMaterial则不会创建实例但会修改共享材质
    material = renderer.material; 

	material.SetColor("_Color", color);
    material.SetFloat("_FloatValue", floatValue);
}

3.Shader全局属性(Global Shader Properties)

csharp 复制代码
这种方法设置的值会对所有Shader中同名的全局属性生效

void Start()
{
    Shader.SetGlobalColor("_GlobalColor", color);
    Shader.SetGlobalFloat("_GlobalFloat", floatValue);
}
相关推荐
17岁的勇气23 天前
Unity Shader unity文档学习笔记(二十二):雪地几种实现方式(1. 2D贴花式 2.3D曲面细分并且实现顶点偏移)
笔记·学习·unity·shader
淡海水1 个月前
【URP】Unity[内置Shader]光照着色器Lit
unity·游戏引擎·shader·urp·着色器·lit
雪下的新火1 个月前
爆炸特效-Unity-04-shader&粒子系统
经验分享·笔记·unity·游戏引擎·shader·粒子系统
寻水的鱼、、3 个月前
【Unity Shader学习笔记】(二)图形显示系统
unity·shader
淡海水3 个月前
【URP】Unity Shader Tags
unity·游戏引擎·渲染·shader·tag·urp
淡海水3 个月前
【URP】Unity 插入自定义RenderPass
unity·游戏引擎·渲染·shader·renderpass
benben0443 个月前
《Unity Shader入门精要》学习笔记一
unity·shader
两水先木示4 个月前
【Unity3D】Shader圆形弧度裁剪
unity·shader·圆形裁剪·弧度裁剪
龚子亦5 个月前
【Shader学习】完整光照效果
unity·技术美术·shader