using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; // 给每个角色准备一些特殊的前置渲染 public class UnitPreprocessing : UnitComponent { [Flags] public enum EUnitPreprocessing { None , DepthTexture, // Unit Depth Texture WorldNormalTexture, // Unit World Normal Texture } public EUnitPreprocessing preprocessing; public RenderTexture unitDepthTexture { get; private set; } public RenderTexture unitWorldNormalTexture { get; private set; } private CommandBuffer m_CBBeforeDepthTexture; private Material m_MaterialDepth; public override void Initialize() { base.Initialize(); } public override void OnPostInitialize() { base.OnPostInitialize(); MainCamera.Instance.customRenderingPipeline.onPreCull += OnWillRenderUnit; MainCamera.Instance.customRenderingPipeline.onPostRender += OnRenderUnit; m_CBBeforeDepthTexture = new CommandBuffer(); PrepareRenderTextures(); PrepareMaterials(); } void PrepareRenderTextures() { int unitHash = owner.GetHashCode(); int width = MainCamera.Instance.camera.pixelWidth; int height = MainCamera.Instance.camera.pixelHeight; unitDepthTexture = new RenderTexture(width, height, 24, RenderTextureFormat.Depth, RenderTextureReadWrite.Linear); unitDepthTexture.name = "UnitDepthTexture_" + owner.GetHashCode(); } void PrepareMaterials() { m_MaterialDepth = new Material(Shader.Find(StaticDefine.shaders[EShader.UnitDepth].name)); } public override void OnUpdate() { base.OnUpdate(); } public override void Release() { MainCamera.Instance.customRenderingPipeline.onPreCull -= OnWillRenderUnit; MainCamera.Instance.customRenderingPipeline.onPostRender -= OnRenderUnit; base.Release(); } private void OnWillRenderUnit() { RenderDepthTexture(); //RenderWorldNormal(); MainCamera.Instance.camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, m_CBBeforeDepthTexture); } void RenderDepthTexture() { var cb = m_CBBeforeDepthTexture; cb.Clear(); cb.SetRenderTarget(unitDepthTexture); cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); cb.SetGlobalVector("unity_LightShadowBias", Vector4.zero); foreach (var r in GetRenderers()) { BodyPartRenderer br = r as BodyPartRenderer; if (br == null) continue; Renderer renderer = br.renderer as Renderer; if (renderer == null) continue; cb.DrawRenderer(renderer, m_MaterialDepth); } } //void RenderWorldNormal() //{ // var cb = m_CBBeforeDepthTexture; // cb.Clear(); // cb.GetTemporaryRT(unitWorldNormalTextureID, -1, -1, 24, FilterMode.Point, RenderTextureFormat.RG16, RenderTextureReadWrite.Linear); // cb.SetRenderTarget(unitWorldNormalTextureID); // cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); //} IEnumerable GetRenderers() { IBodyRendererAgent body = owner.unitRender.body; if (body == null || body.renderers == null || body.renderers.Length == 0) yield break; for (int j = 0; j < body.renderers.Length; ++j) { yield return body.renderers[j]; } } private void OnRenderUnit() { //m_CBBeforeDepthTexture.ReleaseTemporaryRT(unitDepthTextureID); MainCamera.Instance.camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, m_CBBeforeDepthTexture); } }