【发布时间】:2017-03-10 14:14:12
【问题描述】:
我试图在着色器内的两个值之间波动以实现发光效果。
我需要它在着色器本身内部完成,而不是通过 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不就是游戏开始后经过的时间吗?如果是这样,那么您将为 _Glowpower 添加/减去不断增长的值。例如,总和 1-2+3-4+5-6+7 等等,这是走向无穷大
-
您是否尝试过使用 _SinTime 而不是 _Time?也许像
_GlowPower=3*_SinTime.y。我从未使用过它,但从名字上我希望它会返回类似 sin(time) 的东西,它在 -1 和 1 之间振荡 -
统一值不能这样工作。您不能在着色器中更改
_UpDown并期望它为下一次着色器执行保留该值。听起来您应该将此代码移动到脚本中,并且只将最终的_GlowPower提供给着色器。 -
@xyLe_ 非常感谢,这有帮助:)