【问题标题】:Unity Shader Graph - How to Change Parameters --- How to change a parameter of a mesh on all objects at the same time?Unity Shader Graph - 如何更改参数 --- 如何同时更改所有对象上的网格参数?
【发布时间】:2020-11-19 06:03:47
【问题描述】:

我按照这个视频创建了我的第一个着色器。 Dissolve Shader Video Link

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

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() 中逐渐改变值。 现在我想将此参数更改为同时使用此着色器的所有对象。 我希望我很清楚。

我的项目视频: Project, Dissolve_Effect

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

【问题讨论】:

    标签: c# unity3d unity3d-shaders


    【解决方案1】:

    一般情况下,您不应另外使用GetFloat,而应将值存储在本地并从那里计算。


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

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

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


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

    你必须这样做

    • 禁用相应属性的“暴露”。显然它只适用于未在 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);
    }
    

    【讨论】:

    • 我想每 10 秒实例化 20 个立方体。这些立方体使用我们在这里讨论的着色器。我想把shader的参数只改成前20个立方体,10秒后改成另外20个。你说的很有意思,但是我不能用,还是谢谢了。我的英文不是很好。对不起:)
    • 哦,但是有什么反对使用 foreach(var instance in spawnedInstances) { instance.GetComponent&lt;Renderer&gt;().material.SetFloat(...); } 之类的东西呢?
    • 我添加了视频,希望你能明白我想要做什么。
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多