Unity - 从着色器内部修改着色器变量

问题描述 投票:0回答:1

我有一个着色器,它可以在材质上放置一个图案(来自纹理):

...
    float2 patternxy = {_PatX, _PatY}; //_PatX & _PatY from inspector
    float4 pattern = tex2D(_PatTex, i.uv + patternxy);
...
    //adjust brightness depending on pattern strength and pattern map
    if (all(pattern.rgb) == 1) { color.rgb += float3(_PatternStr, _PatternStr, _PatternStr); }
...

现在我想让图案在材质上滚动,因为我已经创建了一个脚本:

public class PatternMover : MonoBehaviour
{
    new private Renderer renderer;
    private WaitForSeconds wait;

    [Range(0f, 1f)] public float delay = 0.1f;
    [Range(0f, 0.5f)] public float step = 0.005f;
    public bool ActX = true;
    public float MulX = 1f;
    public bool ActY = true;
    public float MulY = 1f;

    private void Awake()
    {
        renderer = GetComponent<Renderer>();
    }

    IEnumerator Start()
    {
        while (true) 
        {
            wait = new WaitForSeconds(delay);
            Move();
            yield return wait;
        }
    }

    private void Move()
    {
        if (ActX == true)
        {
            var x = renderer.material.GetFloat("_PatX");
            if (x <= 128) { renderer.material.SetFloat("_PatX", x + step * MulX); } else renderer.material.SetFloat("_PatX", 0);
        }
        if (ActY == true)
        {
            var y = renderer.material.GetFloat("_PatY");
            if (y <= 128) { renderer.material.SetFloat("_PatY", y + step * MulY); } else renderer.material.SetFloat("_PatY", 0);
        }
    }
}

这绝对没问题。我的问题是,我想在 VRChat Avatar 上使用此着色器,这意味着我无法上传自定义脚本。 那么有没有一种方法可以从着色器本身内部获得相同的效果,而无需额外的脚本?

提前致谢

c# shader hlsl
1个回答
0
投票

我用另一种方式修复了它。我没有每次都修改变量,而是将 Unity 的 _Time 变量添加到 _PatX 和 _PatY 变量中...

float2 patxy = {_PatX + (_Time[2]/_TimeDec)*_PatSpdX, _PatY + (_Time[2]/_TimeDec)*_PatSpdY};

就这么简单。

© www.soinside.com 2019 - 2024. All rights reserved.