GameTech/URP 渲染实战
源码 / Ch29/Editor/Ch29Shots.cs
Ch29/Editor/Ch29Shots.cs
// 第 29 章配图
using Cookbook.Core;
using UnityEngine;

namespace Cookbook.Ch29
{
    static class Shots
    {
        [BookShot("ch29-overdraw", W = 800, H = 450, Panels = 2)]
        static void Overdraw(Shot s)
        {
            s.Floor();
            s.Cube(s.Lit(new Color(0.8f, 0.35f, 0.25f)), new Vector3(-1.8f, 0.5f, 1.2f));
            s.Sphere(s.Lit(new Color(0.25f, 0.5f, 0.85f)), new Vector3(1.6f, 0.6f, 1.5f), 1.2f);
            var wall = s.Cube(s.Lit(new Color(0.7f, 0.7f, 0.72f)), new Vector3(0, 1.2f, 3.5f));
            wall.transform.localScale = new Vector3(8f, 2.4f, 0.3f);
            // 一团“烟”:40 张互相重叠的半透明面片
            var smoke = s.Mat("Cookbook/Ch29/SoftQuad");
            smoke.SetTexture("_BaseMap", s.CoreTex("particle_soft"));
            smoke.SetColor("_BaseColor", new Color(0.32f, 0.3f, 0.3f, 0.45f));
            var rnd = new System.Random(3);
            for (int i = 0; i < 40; i++)
            {
                float r() => (float)rnd.NextDouble();
                var q = s.Quad(smoke, new Vector3(-0.2f + (r() - 0.5f) * 1.6f, 0.9f + r() * 1.0f, 0.6f + r() * 1.2f), 0.8f + r() * 1.0f);
                q.transform.rotation = Quaternion.Euler(0, 0, r() * 360f);
            }
            s.LookAt(new Vector3(0, 1.5f, -4.0f), new Vector3(0, 0.9f, 1f), 45);
            if (s.Panel == 1)
            {
                var f = s.Feature<OverdrawFeature>();
                f.settings.countMaterial = s.Mat("Cookbook/Ch29/OverdrawCount");
                f.settings.heatmapMaterial = s.Mat("Cookbook/Ch29/OverdrawHeatmap");
            }
        }

        [BookShot("ch29-mipviz", W = 800, H = 450, Panels = 2)]
        static void MipViz(Shot s)
        {
            var m = s.Mat(s.Panel == 0 ? "Universal Render Pipeline/Unlit" : "Cookbook/Ch29/MipLevelViz");
            m.SetTexture("_BaseMap", s.CoreTex("checker"));
            m.SetTextureScale("_BaseMap", new Vector2(12, 12));
            if (s.Panel == 1) m.SetFloat("_Blend", 0.8f);
            s.Floor(m, 60f);
            var wall = s.Quad(m, new Vector3(-3.2f, 1.5f, 3f), 3f);
            wall.transform.rotation = Quaternion.Euler(0, -35, 0);
            s.LookAt(new Vector3(0, 1.6f, -3f), new Vector3(0, 0.4f, 6f), 55);
        }

        [BookShot("ch29-half", W = 800, H = 450, Panels = 2)]
        static void Half(Shot s)
        {
            var origin = new Vector3(300f, 0, 300f);   // 远离世界原点 300 米
            var m = s.Mat("Cookbook/Ch29/HalfPrecisionDemo");
            m.SetTexture("_BaseMap", s.CoreTex("uv_grid"));
            m.SetFloat("_Tiling", 0.25f);
            m.SetFloat("_EmulateHalf", s.Panel);
            var plane = s.Prim(PrimitiveType.Plane, m, origin);
            plane.transform.localScale = new Vector3(4, 1, 4);
            s.Cube(m, origin + new Vector3(0.5f, 0.75f, 1.0f), 1.5f);
            s.LookAt(origin + new Vector3(0, 3.0f, -5.5f), origin + new Vector3(0, 0, 1.5f), 50);
        }
    }
}