坚持更改着色器反照率 alpha 平滑度

Stucked on changing shader albedo alpha smoothness

我想自定义 unity 的标准着色器,我已经下载了它的源代码,只是想自定义它,这样反照率 alpha 属性 的平滑度应该每帧改变 x(例如 0.1f)。抱歉,如果这是一个糟糕的问题,但我用谷歌搜索了所有可能的内容,但一无所获。提前致谢。

这是使我的问题更清楚的图像,我想在着色器脚本的每一帧上更改此值

它在标准着色器中被称为 _Glossiness。您可以使用此更改它:

material.SetFloat("_Glossiness", .25f);

但是,如果您使用的是 LWRP,那么将其称为 _Smoothness

会更方便

如果您愿意,可以在着色器内部制作动画,但请记住,着色器无法记住任何类型的关于模型状态的信息,除了在这个确切帧上发生的事情。如果需要,您需要使用 Iggy 的解决方案,通过从代码设置值。

但是,您可以使用当前时间为事物设置动画,并可能与正弦波等数学运算一起使用以获得脉动效果。如果我是你,我不会尝试修改标准着色器,那是一堆你不想打开的蠕虫病毒。事实上,Unity 正是为此目的设计了表面着色器。表面着色器可以配置为执行标准着色器所做的任何事情,但代码要少得多。

如果您转到“创建”>“着色器”>“表面着色器”,您将获得一个良好的基础。您还可以找到更多信息 here and here。为了可读性,我不会写下示例中所有参数的代码,但您可以在模板中大致看到它是如何工作的。

在您的情况下,您可以使用 _Time 变量来设置光泽度动画。 _Time 是一个 4d 向量,其中 x、y、z 和 w 值代表不同的时间速度(t/20、t、t*2、t*3)。例如,您可以这样做:

void surf (Input IN, inout SurfaceOutput o) {
    // This will make the smoothness pulsate with time.
    o.Smoothness = sin(_Time.z);
}

如果您确实需要在特定时间开始的效果,那么您可以定义一个偏移时间戳并像 Iggy 的回答中那样从代码中设置它。如果您希望着色器仅在设置时间戳后触发,您可以使用某种基于时间戳值的条件。

float _StartTime
void surf (Input IN, inout SurfaceOutput o) {
    // This will make the smoothness pulsate with time.
    // saturate() clamps the value between 0 and 1.

    if (_StartTime > 0)
        o.Smoothness = sin(saturate(_Time.y - _StartTime));
    else
        o.Smoothness = 0;
}