1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| using UnityEngine;
namespace OKShader { /// <summary> /// 屏幕波纹 /// </summary> public class ScreenRipple : IPostEffect { public AnimationCurve waveform = new AnimationCurve( new Keyframe(0.00f, 0.50f, 0, 0), new Keyframe(0.05f, 1.0f, 0, 0), new Keyframe(0.15f, 0.1f, 0, 0), new Keyframe(0.25f, 0.8f, 0, 0), new Keyframe(0.35f, 0.3f, 0, 0), new Keyframe(0.45f, 0.6f, 0, 0),÷ new Keyframe(0.55f, 0.4f, 0, 0), new Keyframe(0.65f, 0.55f, 0, 0), new Keyframe(0.75f, 0.46f, 0, 0), new Keyframe(0.85f, 0.52f, 0, 0), new Keyframe(0.95f, 0.5f, 0, 0) ); // 波形曲线
[Range(0.01f, 1.0f)] public float waveStrength = 0.5f; // 波浪强度
public Color waveColor = Color.gray; // 波浪颜色
[Range(0.01f, 5f)] public float waveColorStrength = 2.1f; // 波浪颜色强度
[Range(1.0f, 3.0f)] public float waveSpeed = 1.25f; // 波浪速度
private Texture2D m_gradientTexture; // 梯度纹理图 public void OnRenderImage(RenderTexture src, RenderTexture dest) { Graphics.Blit(src, dest, m_material); }
protected override void OnInit() { m_shader = this.Shader; m_material = this.CreateMaterial(Shader); }
protected override void OnRun(object[] arrParam) { this.CreateGradientTexture();
Camera c = this.GetComponent<Camera>(); m_material.SetTexture("_GradTex", m_gradientTexture); m_material.SetColor("_WaveColor", waveColor); m_material.SetVector("_StartParam", new Vector4( 0.5f * c.aspect, 0.5f, Time.timeSinceLevelLoad, 1 / waveSpeed)); m_material.SetVector("_WaveParam", new Vector4(c.aspect, 1, waveStrength, waveColorStrength)); }
protected override void OnPostEffectDestroy() { if (m_gradientTexture != null) { Destroy(m_gradientTexture); m_gradientTexture = null; } } /// <summary> /// 创建梯度图 /// </summary> private void CreateGradientTexture() { if (m_gradientTexture != null) { return; }
m_gradientTexture = new Texture2D(512, 1, TextureFormat.Alpha8, false); m_gradientTexture.name = "ScreenRippleTex"; m_gradientTexture.wrapMode = TextureWrapMode.Clamp; m_gradientTexture.filterMode = FilterMode.Bilinear;
for (var i = 0; i < m_gradientTexture.width; i++) { var x = 1.0f / m_gradientTexture.width * i; var a = waveform.Evaluate(x); m_gradientTexture.SetPixel(i, 0, new Color(a, a, a, a)); } m_gradientTexture.Apply(); } } }
|