unity3d - 在 Unity 着色器中波动浮点值

标签 unity3d shader cg

我试图在着色器内的两个值之间波动以实现发光效果。 我需要它在着色器本身内部完成,而不是通过 C# 脚本。 我尝试使用 Unity 为着色器动画提供的 _Time 值,但它不起作用:

Shader "Test shader" {
Properties {
    _ColorTint ("Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _GlowColor("Glow Color", Color) = (1,0,0,1)
    _GlowPower("Glow Power", Float) = 3.0
    _UpDown("Shine Emitter Don't Change", Float) = 0
}
SubShader {
    Tags { 
        "RenderType"="Opaque" 
    }

    CGPROGRAM
    #pragma surface surf Lambert

    struct Input {
            float4 color : Color;
            float2 uv_MainTex;
            float3 viewDir;
            float4 _Time;
    };

    float4 _ColorTint;
    sampler2D _MainTex;
    float4 _GlowColor;
    float _GlowPower;
    float _UpDown;

    void surf(Input IN, inout SurfaceOutput o) {
        if (_UpDown == 0) {
            _GlowPower += _Time.y;
        }
        if (_UpDown == 1) {
            _GlowPower -= _Time.y;
        }
        if (_GlowPower <= 1) {
            _UpDown = 0;
        }
        if (_GlowPower >= 3) {
            _UpDown = 1;
        }

        IN.color = _ColorTint;
        o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * IN.color;
        half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
        o.Emission = _GlowColor.rgb * pow(rim, _GlowPower);
    }
    ENDCG
}
FallBack "Diffuse"
}

这使得辉光增长到无限。

我做错了什么?

最佳答案

稍微扩展一下我的评论:

在这种情况下你不能使用_Time.y,因为它是游戏开始后耗时,因此它会随着时间的推移而增加。

您可以使用 _SinTime.y 代替,它代表 sin(_Time.y)。这意味着它在值 -1 和 1 之间振荡。您可以使用它并将(可能是 _SinTime 的缩放版本)分配给您的变量:_GlowPower = C * _SinTime.y

有关内置着色器变量的更多信息:http://docs.unity3d.com/Manual/SL-UnityShaderVariables.html

关于unity3d - 在 Unity 着色器中波动浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37831560/

相关文章:

c# - 防止静态属性在异步函数初始化之前被访问

c# - 统一: Detect if the Return or Done key was pressed in the native iOS keyboard

c++ - OpenGL 顶点属性未启用

opengl - 是否有用于OpenGL阴影语言的 Lint 工具?

具有 HDR(16 位)输入的 WPF 像素着色器?

glsl - 如何确定性地检测着色器片段在其 2x2 像素四边形中的位置?

c# - 从列表转换为字典,foreach 语句有问题

unity3d - GameObject Material 中使用的移位/偏移纹理?

opengl - 在 Cg 中访问 OpenGL 状态变量

shader - 从瓷砖图集纹理重复瓷砖