Я пытаюсь колебаться между двумя значениями внутри шейдера, чтобы достичь сияющего эффекта. Мне нужно, чтобы это было сделано внутри самого шейдера, а не с помощью сценариев на C#. Я попытался использовать значение _Time
, что Unity дает нам шейдерной анимации, но он не работает:Колебание флюктуации в шейдере Unity
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 и т. Д., Это идет к бесконечности. – TheDjentleman
Вы пытались использовать _SinTime вместо _Time? Может быть, как '_GlowPower = 3 * _SinTime.y'. Я никогда не использовал его, но от имени я бы ожидал, что он вернет нечто вроде греха (время), которое колеблется между -1 и 1 – TheDjentleman
Равномерные значения не работают. Вы не можете изменить '_UpDown' внутри вашего шейдера и ожидать, что он сохранит это значение для следующего исполнения шейдера. Похоже, что вы должны перенести этот код на сценарий и предоставить финальный '_GlowPower' в шейдер. – Quinchilion