提交 38ca1ddd 编写于 作者: timchen1002's avatar timchen1002

update

上级 f20989b2
......@@ -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}
......
......@@ -3,11 +3,15 @@ using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Profiling;
/// <summary>
/// 相机渲染管理类
/// </summary>
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; }
/// <summary>
/// 绘制所有不支持的着色器
/// 绘制SRP不支持的内置着色器
/// </summary>
partial void DrawUnsupportedShaders()
{
......@@ -46,6 +51,10 @@ partial class CameraRenderer
context.DrawRenderers(cullingResults, ref drawingSettings, ref fliteringSettings);
}
/// <summary>
/// 绘制Gizmos
/// </summary>
/// <returns></returns>
partial void DrawGizmos()
{
if (Handles.ShouldRenderGizmos())
......@@ -55,16 +64,26 @@ partial class CameraRenderer
}
}
/// <summary>
/// 在Game视图绘制的几何体也绘制到Scene视图中
/// </summary>
/// <returns></returns>
partial void PrepareForSceneWindow()
{
if (camera.cameraType == CameraType.SceneView)
{
// 如果切换到了Scene视图,调用次方法完成绘制
ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);
}
}
/// <summary>
/// 设置buffer缓冲区的名字
/// </summary>
/// <returns></returns>
partial void PrepareBuffer()
{
// 设置只有在编辑器模式下才分配内存
Profiler.BeginSample("Editor Only");
buffer.name = camera.name;
Profiler.EndSample();
......
using UnityEngine;
using UnityEngine.Rendering;
/// <summary>
/// 相机渲染管理类:单独控制每个相机的渲染
/// </summary>
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");
/// <summary>
/// 相机渲染
/// </summary>
/// <param name="context"></param>
/// <param name="camera"></param>
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;
}
/// <summary>
/// 设置相机的属性和矩阵,在着色器中被称为unity_matrixvp
/// </summary>
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();
}
/// <summary>
/// 提交缓冲区命令
/// </summary>
void Submit()
{
buffer.EndSample(sampleName);
......@@ -65,6 +89,9 @@ public partial class CameraRenderer
context.Submit();
}
/// <summary>
/// 执行缓冲区命令
/// </summary>
void ExecuteBuffer()
{
context.ExecuteCommandBuffer(buffer);
......@@ -72,28 +99,29 @@ public partial class CameraRenderer
}
/// <summary>
/// 绘制可见几何体
/// 绘制可见几何体,顺序:不透明物体->天空盒->透明物体
/// </summary>
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);
}
}
using UnityEngine;
using UnityEngine.Rendering;
/// <summary>
/// 自定义渲染管线实例
/// </summary>
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);
......
using UnityEngine;
using UnityEngine.Rendering;
/// <summary>
/// 自定义渲染管线资产
/// </summary>
[CreateAssetMenu(menuName = "Rendering/Custom Render Pipeline")]
public class CustomRenderPipelineAsset : RenderPipelineAsset
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册