坚持更改着色器反照率 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;
}
我想自定义 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;
}