1

我按照这个视频创建了我的第一个着色器。溶解着色器视频链接

在协程中,我从对象中获取了材质的组件:

PalaceMaterial = palaceInstance.GetComponent <Renderer> () .material;

我将参数设置为0:

PalaceMaterial.SetFloat ("_ CutoffHeight", 0);

为了达到这个效果,我不得不逐渐修改参数“CuttoffHeight”,把它放到Update()中

 PalaceMaterial.SetFloat("_CutoffHeight", Mathf.MoveTowards(PalaceMaterial.GetFloat("_CutoffHeight"), CutoffHeight, 100 * Time.deltaTime));

我将此应用于所有对象。每 2 秒我实例化一个“不可见对象”(CutoffHeight 设置为 0),并在 Update() 中逐渐改变值。现在我想将此参数更改为同时使用此着色器的所有对象。我希望我很清楚。

我的项目视频: 项目Dissolve_Effect

我想在第一个平台上的所有立方体中同时更改“_CutoffHeight”参数,然后在第二个平台中,等等。你知道吗?

4

1 回答 1

3

一般来说,您不应该另外使用GetFloat,而是将值存储在本地并从那里计算。


如果多个对象通过使用例如共享完全相同的材料,那么这已经可以工作了

GetComponent<Renderer>().sharedMaterial.SetFloat(...);

但这仅在您的渲染器中没有材质的多个实例时才有效。


有一种方法可以为我在这个线程中遇到的所有着色器(具有该属性)及其相应的实例(=材质)设置一个属性

为此,您必须

  • 禁用相应属性的“暴露”。显然,它仅适用于检查器中未公开的属性。

  • 使用您可以在着色器资产本身的 Inspector 中找到的生成着色器属性 ID。

    您也可以使用检索它Shader.PropertyToID

    您也可以更改它以匹配您的实际参数名称。

  • 使用着色器的全局设置方法,如Shader.SetGlobalXY

在此处输入图像描述

例如为了设置Spec Brightness你会做

Shader.SetGlobalFloat("Vector1_DD757871", value);

所以在你的情况下,你可能有一个控制器做类似的事情

// Need this only if you have to get the initial value once
[SerializeField] private Material PalaceMaterial;

private float currentValue;
private string propertyId;

private void Awake()
{
    propertyId = Shader.PropertyToID("_CutoffHeight");
    currentValue = PalaceMaterial.GetFloat("_CutoffHeight");
}

private void Update()
{
    currentValue = Maths.MoveTowards(currentValue, CutoffHeight, 100 * Time.deltaTime);
    Shader.SetGlobalFloat(propertyId, currentValue);
}
于 2020-07-29T16:21:32.757 回答