158 lines
4.4 KiB
C#
158 lines
4.4 KiB
C#
|
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
|