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