Files
2026-03-04 10:03:45 +08:00

72 lines
1.9 KiB
C#

using UnityEngine;
using UnityEngine.Serialization;
namespace UltimateWater
{
[RequireComponent(typeof(Water))]
public sealed class WaterNormalMapAnimation : MonoBehaviour
{
[HideInInspector]
[SerializeField]
[FormerlySerializedAs("normalMapShader")]
private Shader _NormalMapShader;
[SerializeField]
[FormerlySerializedAs("resolution")]
private int _Resolution = 512;
[SerializeField]
[FormerlySerializedAs("period")]
private float _Period = 60f;
[SerializeField]
[FormerlySerializedAs("animationSpeed")]
private float _AnimationSpeed = 0.015f;
[SerializeField]
[FormerlySerializedAs("intensity")]
private float _Intensity = 2f;
private Water _Water;
private RenderTexture _NormalMap1;
private Texture _SourceNormalMap;
private Material _NormalMapMaterial;
private void Start()
{
OnValidate();
_NormalMap1 = new RenderTexture(_Resolution, _Resolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear)
{
name = "[UWS] WaterNormalMapAnimation - Normal Map 1",
wrapMode = TextureWrapMode.Repeat
};
_NormalMapMaterial = new Material(_NormalMapShader)
{
hideFlags = HideFlags.DontSave
};
_Water = GetComponent<Water>();
_SourceNormalMap = _Water.Materials.SurfaceMaterial.GetTexture("_BumpMap");
_Water.Materials.SurfaceMaterial.SetTexture("_BumpMap", _NormalMap1);
}
private void OnValidate()
{
if (_NormalMapShader == null)
{
_NormalMapShader = Shader.Find("UltimateWater/Utilities/WaterNormalMap");
}
}
private void Update()
{
_NormalMapMaterial.SetVector(ShaderVariables.Offset, new Vector4(0f, 0f, Time.time * _AnimationSpeed, 0f));
_NormalMapMaterial.SetVector(ShaderVariables.Period, new Vector4(_Period, _Period, _Period, _Period));
_NormalMapMaterial.SetFloat("_Param", _Intensity);
Graphics.Blit(_SourceNormalMap, _NormalMap1, _NormalMapMaterial, 0);
}
}
}