Unity3d 更改着色器反照率alpha平滑度时出错

Unity3d 更改着色器反照率alpha平滑度时出错,unity3d,shader,game-development,cg,Unity3d,Shader,Game Development,Cg,我想定制unity的标准着色器,我已经下载了它的源代码,只想定制它,这样反照率alpha属性的平滑度应该改变XF,例如每帧0.1f。对不起,如果这是一个糟糕的问题,但我在谷歌上搜索了所有我能找到的东西,但什么也没找到。提前谢谢 这是一张让我的问题更清楚的图片,我想在着色器脚本的每一帧上更改这个值 在标准着色器中称为_glossness。您可以使用以下方法进行更改: 材料的光泽度为.25f 但是,如果使用LWRP,则更方便地称之为“平滑度”它在标准着色器中称为“光泽度”。您可以使用以下方法进行更改

我想定制unity的标准着色器,我已经下载了它的源代码,只想定制它,这样反照率alpha属性的平滑度应该改变XF,例如每帧0.1f。对不起,如果这是一个糟糕的问题,但我在谷歌上搜索了所有我能找到的东西,但什么也没找到。提前谢谢

这是一张让我的问题更清楚的图片,我想在着色器脚本的每一帧上更改这个值

在标准着色器中称为_glossness。您可以使用以下方法进行更改:

材料的光泽度为.25f

但是,如果使用LWRP,则更方便地称之为“平滑度”

它在标准着色器中称为“光泽度”。您可以使用以下方法进行更改:

材料的光泽度为.25f


但是,如果使用LWRP,则更方便地称之为“平滑度”(Smoothness)

,如果需要,可以在着色器内部执行动画,但请记住,着色器无法记住关于模型状态的任何类型的信息,除了在该确切帧发生的情况。如果您想这样做,您需要使用Iggy的解决方案,通过设置代码中的值

但是,您可以使用当前时间设置动画,并可能与一些数学(如正弦波)结合使用,以获得脉动效果。如果我是你,我不会尝试修改标准着色器,那是一罐你不想打开的蠕虫。事实上,Unity设计的曲面着色器正是出于这个目的。曲面着色器可以配置为执行标准着色器执行的任何操作,但代码要少得多

如果您选择“创建>着色器>曲面着色器”,则可以获得良好的基础。您还可以找到更多信息和。为了便于阅读,我不会写下示例中所有参数的代码,但您可以在模板中大致了解其工作原理

在本例中,可以使用_时间变量设置光泽度的动画_时间是一个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;
}

如果需要,可以在着色器内执行动画,但请记住,着色器无法记住关于模型状态的任何类型的信息,除了在该确切帧发生的情况。如果您想这样做,您需要使用Iggy的解决方案,通过设置代码中的值

但是,您可以使用当前时间设置动画,并可能与一些数学(如正弦波)结合使用,以获得脉动效果。如果我是你,我不会尝试修改标准着色器,那是一罐你不想打开的蠕虫。事实上,Unity设计的曲面着色器正是出于这个目的。曲面着色器可以配置为执行标准着色器执行的任何操作,但代码要少得多

如果您选择“创建>着色器>曲面着色器”,则可以获得良好的基础。您还可以找到更多信息和。为了便于阅读,我不会写下示例中所有参数的代码,但您可以在模板中大致了解其工作原理

在本例中,可以使用_时间变量设置光泽度的动画_时间是一个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;
}

感谢您的回复,但这不是我需要的,这是c方式更改该值,但它是由cpu计算的,我需要效率,所以我想从着色器脚本中执行相同的操作。在这种情况下,您可以下载并修改。我已经对其进行了下载,但无法正确修改,这就是我发布这个问题的原因谢谢你的回复,但这不是我需要的,这是改变这个值的c方式,但它是由cpu计算的,我需要效率,所以我想从着色器脚本中执行同样的操作。在这种情况下,你可以下载并修改。我已经下载了它,但我无法正确修改它,这就是我为什么发这个问题的原因非常感谢,这是我所需要的谢谢,这是我所需要的