From 38ca1dddf7c63ba7d154845bc32214add012b132 Mon Sep 17 00:00:00 2001 From: timchen <365931026@qq.com> Date: Fri, 10 Sep 2021 08:55:52 +0800 Subject: [PATCH] update --- Assets/RawAssets/Standard Transparent.mat | 13 +++--- Assets/Scripts/CameraRenderer.Editor.cs | 21 +++++++++- Assets/Scripts/CameraRenderer.cs | 44 +++++++++++++++++---- Assets/Scripts/CustomRenderPipeline.cs | 4 ++ Assets/Scripts/CustomRenderPipelineAsset.cs | 3 ++ 5 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Assets/RawAssets/Standard Transparent.mat b/Assets/RawAssets/Standard Transparent.mat index 81bc584..86d94b7 100644 --- a/Assets/RawAssets/Standard Transparent.mat +++ b/Assets/RawAssets/Standard Transparent.mat @@ -9,12 +9,13 @@ Material: m_PrefabAsset: {fileID: 0} m_Name: Standard Transparent m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent disabledShaderPasses: [] m_SavedProperties: serializedVersion: 3 @@ -60,19 +61,19 @@ Material: - _BumpScale: 1 - _Cutoff: 0.5 - _DetailNormalMapScale: 1 - - _DstBlend: 0 + - _DstBlend: 10 - _GlossMapScale: 1 - _Glossiness: 0.5 - _GlossyReflections: 1 - _Metallic: 0 - - _Mode: 0 + - _Mode: 3 - _OcclusionStrength: 1 - _Parallax: 0.02 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 - _UVSec: 0 - - _ZWrite: 1 + - _ZWrite: 0 m_Colors: - _Color: {r: 0.18039227, g: 0, b: 1, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Scripts/CameraRenderer.Editor.cs b/Assets/Scripts/CameraRenderer.Editor.cs index 2f33326..30e860f 100644 --- a/Assets/Scripts/CameraRenderer.Editor.cs +++ b/Assets/Scripts/CameraRenderer.Editor.cs @@ -3,11 +3,15 @@ using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Profiling; +/// +/// 相机渲染管理类 +/// partial class CameraRenderer { partial void DrawGizmos(); partial void DrawUnsupportedShaders(); #if UNITY_EDITOR + // SRP不支持的着色器标签类型 static ShaderTagId[] legacyShaderTagIds = { new ShaderTagId("Always"), new ShaderTagId("ForwardBase"), @@ -16,6 +20,7 @@ partial class CameraRenderer new ShaderTagId("VertexLMRGBM"), new ShaderTagId("VertexLM"), }; + // 绘制成使用错误材质的粉红色颜色 static Material errorMaterial; partial void PrepareForSceneWindow(); @@ -25,7 +30,7 @@ partial class CameraRenderer string sampleName { get; set; } /// - /// 绘制所有不支持的着色器 + /// 绘制SRP不支持的内置着色器 /// partial void DrawUnsupportedShaders() { @@ -46,6 +51,10 @@ partial class CameraRenderer context.DrawRenderers(cullingResults, ref drawingSettings, ref fliteringSettings); } + /// + /// 绘制Gizmos + /// + /// partial void DrawGizmos() { if (Handles.ShouldRenderGizmos()) @@ -55,16 +64,26 @@ partial class CameraRenderer } } + /// + /// 在Game视图绘制的几何体也绘制到Scene视图中 + /// + /// partial void PrepareForSceneWindow() { if (camera.cameraType == CameraType.SceneView) { + // 如果切换到了Scene视图,调用次方法完成绘制 ScriptableRenderContext.EmitWorldGeometryForSceneView(camera); } } + /// + /// 设置buffer缓冲区的名字 + /// + /// partial void PrepareBuffer() { + // 设置只有在编辑器模式下才分配内存 Profiler.BeginSample("Editor Only"); buffer.name = camera.name; Profiler.EndSample(); diff --git a/Assets/Scripts/CameraRenderer.cs b/Assets/Scripts/CameraRenderer.cs index ab113cf..3c4dd06 100644 --- a/Assets/Scripts/CameraRenderer.cs +++ b/Assets/Scripts/CameraRenderer.cs @@ -1,36 +1,53 @@ using UnityEngine; using UnityEngine.Rendering; +/// +/// 相机渲染管理类:单独控制每个相机的渲染 +/// public partial class CameraRenderer { ScriptableRenderContext context; Camera camera; const string bufferName = "Render Camera"; + // 创建缓冲区 CommandBuffer buffer = new CommandBuffer { name = bufferName }; + // 存储相机剔除后的结果 CullingResults cullingResults; + // 着色器标记ID static ShaderTagId unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit"); + /// + /// 相机渲染 + /// + /// + /// public void Render(ScriptableRenderContext context, Camera camera) { this.context = context; this.camera = camera; + // 设置buffer缓冲区的名字 PrepareBuffer(); + // 在Game视图绘制的几何体也绘制到Scene视图中 PrepareForSceneWindow(); if (!Cull()) { return; } Setup(); + // 绘制可见几何体 DrawVisibleGeometry(); + // 绘制SRP不支持的内置shader类型 DrawUnsupportedShaders(); + // 绘制Gizmos DrawGizmos(); + // 提交缓冲区 Submit(); } @@ -48,16 +65,23 @@ public partial class CameraRenderer return false; } + /// + /// 设置相机的属性和矩阵,在着色器中被称为unity_matrixvp + /// void Setup() { - // 设置视图投影矩阵 在着色器中被称为unity_matrixvp context.SetupCameraProperties(camera); + // 得到相机的clearflags CameraClearFlags flags = camera.clearFlags; + // 设置相机清除状态 buffer.ClearRenderTarget(flags <= CameraClearFlags.Depth, flags == CameraClearFlags.Color, flags == CameraClearFlags.Color ? camera.backgroundColor.linear : Color.clear); buffer.BeginSample(sampleName); ExecuteBuffer(); } + /// + /// 提交缓冲区命令 + /// void Submit() { buffer.EndSample(sampleName); @@ -65,6 +89,9 @@ public partial class CameraRenderer context.Submit(); } + /// + /// 执行缓冲区命令 + /// void ExecuteBuffer() { context.ExecuteCommandBuffer(buffer); @@ -72,28 +99,29 @@ public partial class CameraRenderer } /// - /// 绘制可见几何体 + /// 绘制可见几何体,顺序:不透明物体->天空盒->透明物体 /// void DrawVisibleGeometry() { - // 顺序:不透明->天空盒->透明 + // 设置绘制顺序和指定渲染相机 var sortingSettings = new SortingSettings(camera) { criteria = SortingCriteria.CommonOpaque }; - // 用哪个着色器(shaderPassName)和对可见对象排序(sortingSettings) + // 设置渲染的shader pass和渲染顺序 var drawingSettings = new DrawingSettings(unlitShaderTagId, sortingSettings); - // 描述如何过滤要渲染的给定可见对象集 - var filteringSettings = new FilteringSettings(RenderQueueRange.all); + // 只绘制RenderQueue为opaque不透明物体 + var filteringSettings = new FilteringSettings(RenderQueueRange.opaque); - // 绘制不透明 + // 绘制不透明物体 context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); // 绘制天空盒 context.DrawSkybox(camera); sortingSettings.criteria = SortingCriteria.CommonTransparent; drawingSettings.sortingSettings = sortingSettings; + // 只绘制RenderQueue为transparent透明的物体 filteringSettings.renderQueueRange = RenderQueueRange.transparent; - // 绘制透明 + // 绘制透明物体 context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); } } diff --git a/Assets/Scripts/CustomRenderPipeline.cs b/Assets/Scripts/CustomRenderPipeline.cs index b18745d..d657619 100644 --- a/Assets/Scripts/CustomRenderPipeline.cs +++ b/Assets/Scripts/CustomRenderPipeline.cs @@ -1,11 +1,15 @@ using UnityEngine; using UnityEngine.Rendering; +/// +/// 自定义渲染管线实例 +/// public class CustomRenderPipeline : RenderPipeline { CameraRenderer renderer = new CameraRenderer(); protected override void Render(ScriptableRenderContext context, Camera[] cameras) { + // 遍历所有相机单独渲染 foreach (Camera camera in cameras) { renderer.Render(context, camera); diff --git a/Assets/Scripts/CustomRenderPipelineAsset.cs b/Assets/Scripts/CustomRenderPipelineAsset.cs index 5b8a3b0..fc459d7 100644 --- a/Assets/Scripts/CustomRenderPipelineAsset.cs +++ b/Assets/Scripts/CustomRenderPipelineAsset.cs @@ -1,6 +1,9 @@ using UnityEngine; using UnityEngine.Rendering; +/// +/// 自定义渲染管线资产 +/// [CreateAssetMenu(menuName = "Rendering/Custom Render Pipeline")] public class CustomRenderPipelineAsset : RenderPipelineAsset { -- GitLab