URP源码学习
<h2>类图</h2>
<pre><code class="language-plantuml">@startuml
RenderPipeline <|-- UniversalRenderPipeline
RenderPipeline -> ScriptableRenderContext
UniversalRenderPipeline *-- UniversalRenderPipelineAsset
UniversalRenderPipelineAsset *-- ScriptableRenderer
UniversalRenderPipelineAsset *-- ScriptableRendererData
ScriptableRenderer <- ScriptableRendererData
UniversalRenderPipeline --> Camera
Camera *-- UniversalAdditionalCameraData
UniversalAdditionalCameraData *-- ScriptableRenderer
UniversalRenderer --|> ScriptableRenderer
ForwardRenderer --|> ScriptableRenderer
ScriptableRenderer *--- MainLightShadowCasterPass
ScriptableRenderer *--- AdditionalLightsShadowCasterPass
ScriptableRenderer *---- DrawObjectsPass
ScriptableRenderer *---- DrawSkyboxPass
ScriptableRenderer *---- PostProcessPass
MainLightShadowCasterPass --|> ScriptableRenderPass
AdditionalLightsShadowCasterPass --|> ScriptableRenderPass
DrawObjectsPass --|> ScriptableRenderPass
DrawSkyboxPass --|> ScriptableRenderPass
PostProcessPass --|> ScriptableRenderPass
@enduml</code></pre>
<p>UniversalRenderPipelineAsset 质量等级设置</p>
<h2>时序图</h2>
<h3>UniversalRenderPipeline.Render</h3>
<p>核心方法入口,RenderPipleline的渲染方法,关键流程是逐相机调用渲染方法</p>
<ol>
<li>设置相机参数</li>
<li>裁剪</li>
<li>调用context.DrawRenderers</li>
<li>提交context.Submit</li>
</ol>
<p>简单example</p>
<pre><code class="language-csharp">public class MyRenderPipeline : RenderPipeline
{
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
for (int i = 0; i < cameras.Length; i++)
{
//设置相机参数
Camera camera = cameras[i];
context.SetupCameraProperties(camera);
context.DrawSkybox(camera);
//相机裁剪
camera.TryGetCullingParameters(out var parameters);
CullingResults results = context.Cull(ref parameters);
DrawingSettings ds = new DrawingSettings();
//指定使用设定的LightMode的Pass
//DrawSettings里面的SetShaderPassName查找的不不不(重要的事情说三遍)是Shader的Pass中那个Name “xxx” 不是那个!!!找的是Tags中的LightMode!虽然不知道为什么,但是记住就对了。
/*
Pass
{
Tags{ "LightMode" = "SForward"}
}
*/
ds.SetShaderPassName(0, new ShaderTagId("SForward"));
//排序设置
//必须设置criteria字段,笔者我一直以为其他地方出问题了,结果查了半天就是因为这个,就是它,大家记住这个可恶的字段
ds.sortingSettings = new SortingSettings(camera){criteria = SortingCriteria.CommonOpaque};
//过滤设置
FilteringSettings fs = new FilteringSettings(RenderQueueRange.opaque,-1);
context.DrawRenderers(results, ref ds, ref fs);
}
context.Submit();
}
}</code></pre>
<pre><code class="language-plantuml">@startuml
判定组件 -> commonlua: 退出显微指认模式[Exit显微指认Mode()]
commonlua -> 显微镜: [Exit显微指认Mode()]
显微镜 -> 成像控制: 关闭准星[Close准星()]
显微镜 -> 成像控制: 获取准星对应模版的灰度值[xxx接口]
显微镜 -> 玻片器材: 灰度值
玻片器材 -> 玻片器材: 灰度映射指认结果
玻片器材 -> 判定组件: 判定结果
判定组件 -> 判定组件: 结算
@enduml</code></pre>
<h3>Pass示例</h3>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=437a72c22bcc9a680a7868920d2c1f4e" alt="" /></p>
<p>参考文档
<a href="https://www.cnblogs.com/shenyibo/p/12485235.html">https://www.cnblogs.com/shenyibo/p/12485235.html</a></p>