GameTech/URP 渲染实战
源码 / Ch04/Editor/Ch04Shots.cs
Ch04/Editor/Ch04Shots.cs
// 第 4 章配图:正交相机正对一张铺满画面的面片,直接看 Shader 的输出
using Cookbook.Core;
using UnityEngine;

namespace Cookbook.Ch04
{
    static class Shots
    {
        static readonly Color Bg = new Color(0.08f, 0.10f, 0.12f);

        static void Ortho(Shot s, Color bg)
        {
            s.Background(bg);
            s.Cam.orthographic = true;
            s.Cam.orthographicSize = 0.5f;
            s.Cam.transform.position = new Vector3(0, 0, -2);
            s.Cam.transform.rotation = Quaternion.identity;
        }

        static GameObject Flat(Shot s, Material m, Vector3 pos, Vector2 size)
        {
            var q = s.Quad(m, pos, 1f);
            q.transform.localScale = new Vector3(size.x, size.y, 1);
            return q;
        }

        static GameObject Full(Shot s, Material m)
        {
            Ortho(s, Color.black);
            return Flat(s, m, Vector3.zero, Vector2.one);
        }

        [BookShot("ch04-plot", W = 420, H = 420, Panels = 3)]
        static void Plot(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/FunctionPlot");
            m.SetFloat("_Mode", s.Panel);
            Full(s, m);
        }

        [BookShot("ch04-patterns", W = 400, H = 400, Panels = 3)]
        static void Patterns(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/Patterns");
            m.SetFloat("_Pattern", s.Panel);
            if (s.Panel == 0) { m.SetFloat("_Scale", 8); }
            if (s.Panel == 1) { m.SetFloat("_Scale", 9); m.SetFloat("_Angle", 30); m.SetFloat("_Duty", 0.45f); m.SetColor("_ColorA", new Color(0.91f, 0.45f, 0.23f)); }
            if (s.Panel == 2) { m.SetFloat("_Scale", 7); m.SetFloat("_Duty", 0.62f); m.SetFloat("_Angle", 0); m.SetColor("_ColorA", new Color(0.18f, 0.49f, 0.34f)); }
            Full(s, m);
        }

        [BookShot("ch04-progress", W = 420, H = 420, Panels = 3)]
        static void Progress(Shot s)
        {
            Ortho(s, Bg);
            var ring = s.Mat("Cookbook/Ch04/RingProgress");
            ring.SetFloat("_Progress", new[] { 0.25f, 0.6f, 0.92f }[s.Panel]);
            ring.SetColor("_BgColor", Bg);
            Flat(s, ring, new Vector3(0, 0.12f, 0), new Vector2(0.66f, 0.66f));

            var bar = s.Mat("Cookbook/Ch04/HealthBar");
            bar.SetFloat("_Health", new[] { 0.85f, 0.5f, 0.18f }[s.Panel]);
            bar.SetFloat("_Trail", new[] { 0.93f, 0.68f, 0.42f }[s.Panel]);
            bar.SetFloat("_Aspect", 6f);
            bar.SetFloat("_FlashPhase", Mathf.PI * 0.5f);
            bar.SetColor("_BgColor", Bg);
            Flat(s, bar, new Vector3(0, -0.34f, 0), new Vector2(0.84f, 0.14f));
        }

        [BookShot("ch04-polar", W = 400, H = 400, Panels = 3)]
        static void Polar(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/Polar");
            m.SetFloat("_Mode", s.Panel);
            m.SetFloat("_Speed", 0);
            m.SetFloat("_Count", new[] { 6f, 4f, 14f }[s.Panel]);
            m.SetFloat("_Angle", s.Panel == 0 ? 90f : 0f);
            if (s.Panel == 2) { m.SetColor("_ColorA", new Color(0.95f, 0.62f, 0.25f)); m.SetColor("_ColorB", new Color(0.86f, 0.36f, 0.18f)); }
            Full(s, m);
        }

        [BookShot("ch04-noise", W = 360, H = 360, Panels = 4)]
        static void Noise(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/Noise");
            m.SetFloat("_Mode", s.Panel);
            m.SetFloat("_Scale", 6);
            Full(s, m);
        }

        [BookShot("ch04-voronoi", W = 400, H = 400, Panels = 3)]
        static void Voronoi(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/Voronoi");
            m.SetFloat("_Mode", s.Panel);
            m.SetFloat("_Scale", 5);
            m.SetFloat("_Speed", 0);
            Full(s, m);
        }

        [BookShot("ch04-fbm", W = 400, H = 400, Panels = 3)]
        static void Fbm(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/FbmClouds");
            m.SetFloat("_Octaves", new[] { 1f, 3f, 8f }[s.Panel]);
            m.SetVector("_Wind", Vector4.zero);
            Full(s, m);
        }

        [BookShot("ch04-warp", W = 400, H = 400, Panels = 3)]
        static void Warp(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/DomainWarp");
            m.SetFloat("_Levels", s.Panel);
            m.SetFloat("_Speed", 0);
            Full(s, m);
        }

        [BookShot("ch04-sdf", W = 360, H = 360, Panels = 4)]
        static void Sdf(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/SDFIcon");
            m.SetFloat("_Mode", s.Panel);
            Full(s, m);
        }

        [BookShot("ch04-bayer", W = 360, H = 360, Panels = 4)]
        static void Bayer(Shot s)
        {
            var m = s.Mat("Cookbook/Ch04/BayerDither");
            m.SetFloat("_Mode", new[] { 0f, 2f, 3f, 2f }[s.Panel]);
            m.SetFloat("_Levels", s.Panel == 3 ? 4 : 2);
            m.SetFloat("_Resolution", 96);
            Full(s, m);
        }
    }
}