using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; // https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html // https://docs.unity3d.com/ScriptReference/Rendering.CameraEvent.html // 前向渲染的camera events // * DepthTexture // * DepthNormalTexture // * ForwardOpaque // * ImageEffectsOpaque // * Skybox // * ForwardAlpha // * ImageEffects // * Everything [Flags] public enum ERenderingEvent { None = 0, BeforeDepthTexture = 1, BeforeDepthNormalsTexture = 1 << 1, BeforeForwardOpaque = 1 << 2, BeforeImageEffectsOpaque = 1 << 3, BeforeSkybox = 1 << 4, BeforeForwardAlpha = 1 << 5, BeforeImageEffects = 1 << 6, //BeforeEverything = 1 << 7, AfterDepthTexture = 1 << 8, AfterDepthNormalsTexture = 1 << 9, AfterForwardOpaque = 1 << 10, AfterImageEffectsOpaque = 1 << 11, AfterSkybox = 1 << 12, AfterForwardAlpha = 1 << 13, AfterImageEffects = 1 << 14, AfterEverything = 1 << 15, } public static class RenderingUtility { public static Dictionary renderingEventToCameraEventDic = new Dictionary { {ERenderingEvent.BeforeDepthTexture, CameraEvent.BeforeDepthTexture }, {ERenderingEvent.BeforeDepthNormalsTexture, CameraEvent.BeforeDepthNormalsTexture }, {ERenderingEvent.BeforeForwardOpaque, CameraEvent.BeforeForwardOpaque }, {ERenderingEvent.BeforeImageEffectsOpaque, CameraEvent.BeforeImageEffectsOpaque }, {ERenderingEvent.BeforeSkybox, CameraEvent.BeforeSkybox }, {ERenderingEvent.BeforeForwardAlpha, CameraEvent.BeforeForwardAlpha }, {ERenderingEvent.BeforeImageEffects, CameraEvent.BeforeImageEffects }, {ERenderingEvent.AfterDepthTexture, CameraEvent.AfterDepthTexture }, {ERenderingEvent.AfterDepthNormalsTexture, CameraEvent.AfterDepthNormalsTexture }, {ERenderingEvent.AfterForwardOpaque, CameraEvent.AfterForwardOpaque }, {ERenderingEvent.AfterImageEffectsOpaque, CameraEvent.AfterImageEffectsOpaque }, {ERenderingEvent.AfterSkybox, CameraEvent.AfterSkybox }, {ERenderingEvent.AfterForwardAlpha, CameraEvent.AfterForwardAlpha }, {ERenderingEvent.AfterImageEffects, CameraEvent.AfterImageEffects }, {ERenderingEvent.AfterEverything, CameraEvent.AfterEverything }, }; public static CameraEvent ToCameraEvent(this ERenderingEvent e) { return renderingEventToCameraEventDic[e]; } /// /// 计算在rt里面的区域 /// /// 相机 /// 世界空间坐标 /// 异体矩形(billboard)的相机空间大小 /// public static Vector4 GetTillingOffset(Camera camera, Vector3 worldPos, float size) { Vector4 tileOffset = new Vector4(1,1,0,0); Vector3 camPos = camera.WorldToCameraSpace(worldPos); Vector3 bottomLeft = new Vector3(camPos.x - size / 2, camPos.y - size / 2, camPos.z); Vector3 topRight = new Vector3(camPos.x + size / 2, camPos.y + size / 2, camPos.z); Vector2 blViewPos = camera.CameraToViewportSpace(bottomLeft); Vector2 trViewPos = camera.CameraToViewportSpace(topRight); float width = trViewPos.x - blViewPos.x; float height = trViewPos.y - blViewPos.y; tileOffset.x = width; tileOffset.y = height; tileOffset.z = blViewPos.x; tileOffset.w = blViewPos.y; return tileOffset; } }