using System.Collections; using System.Collections.Generic; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.Profiling; using UnityEngine.Rendering; public partial class CameraRenderer { private const string BUFFER_NAME = "Render Camera"; #if UNITY_EDITOR private string SampleName { get; set; } #else const string SampleName = BUFFER_NAME; #endif private static ShaderTagId _unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit"); private static ShaderTagId[] _legacyShaderTagIds = { new ShaderTagId("Always"), new ShaderTagId("ForwardBase"), new ShaderTagId("PrepassBase"), new ShaderTagId("Vertex"), new ShaderTagId("VertexLMRGBM"), new ShaderTagId("VertexLM"), }; private ScriptableRenderContext _context; private Camera _camera; private CullingResults _cullingResults; private readonly CommandBuffer _buffer = new CommandBuffer() { name = BUFFER_NAME }; public void Render(ScriptableRenderContext context, Camera camera) { _context = context; _camera = camera; PrepareBuffer(); PrepareForSceneWindow(); if (!Cull()) return; Setup(); DrawVisibleGeometry(); DrawUnsupportedShaders(); DrawGizmos(); SubmitEvent(); } partial void PrepareBuffer(); partial void PrepareForSceneWindow(); partial void DrawUnsupportedShaders(); partial void DrawGizmos(); private void DrawVisibleGeometry() { var sortingSettings = new SortingSettings(_camera) { criteria = SortingCriteria.CommonOpaque }; var drawingSettings = new DrawingSettings(_unlitShaderTagId, sortingSettings); var filteringSettings = new FilteringSettings(RenderQueueRange.opaque); _context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings); _context.DrawSkybox(_camera); sortingSettings.criteria = SortingCriteria.CommonTransparent; drawingSettings.sortingSettings = sortingSettings; filteringSettings.renderQueueRange = RenderQueueRange.transparent; _context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings); } private bool Cull() { if (_camera.TryGetCullingParameters(out var p)) { _cullingResults = _context.Cull(ref p); return true; } return false; } private void Setup() { _context.SetupCameraProperties(_camera); CameraClearFlags flags = _camera.clearFlags; _buffer.ClearRenderTarget( flags <= CameraClearFlags.Depth, flags == CameraClearFlags.Color, flags == CameraClearFlags.Color ? _camera.backgroundColor.linear : Color.clear); _buffer.BeginSample(SampleName); ExecuteBuffer(); } private void ExecuteBuffer() { _context.ExecuteCommandBuffer(_buffer); _buffer.Clear(); } private void SubmitEvent() { _buffer.EndSample(SampleName); ExecuteBuffer(); _context.Submit(); } } #region Editor #if UNITY_EDITOR public partial class CameraRenderer { partial void DrawUnsupportedShaders() { var drawingSettings = new DrawingSettings(_legacyShaderTagIds[0], new SortingSettings(_camera)); var filteringSettings = FilteringSettings.defaultValue; _context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings); for (int i = 1; i < _legacyShaderTagIds.Length; i++) { drawingSettings.SetShaderPassName(i, _legacyShaderTagIds[i]); } } partial void DrawGizmos() { if (Handles.ShouldRenderGizmos()) { _context.DrawGizmos(_camera,GizmoSubset.PreImageEffects); _context.DrawGizmos(_camera,GizmoSubset.PostImageEffects); } } partial void PrepareBuffer() { Profiler.BeginSample("Editor Only"); _buffer.name = SampleName = _camera.name; Profiler.EndSample(); } partial void PrepareForSceneWindow() { if (_camera.cameraType == CameraType.SceneView) { ScriptableRenderContext.EmitWorldGeometryForSceneView(_camera); } } } #endif #endregion