黄金民的个人文档

黄金民的个人文档


URP源码学习

<h2>类图</h2> <pre><code class="language-plantuml">@startuml RenderPipeline &lt;|-- UniversalRenderPipeline RenderPipeline -&gt; ScriptableRenderContext UniversalRenderPipeline *-- UniversalRenderPipelineAsset UniversalRenderPipelineAsset *-- ScriptableRenderer UniversalRenderPipelineAsset *-- ScriptableRendererData ScriptableRenderer &lt;- ScriptableRendererData UniversalRenderPipeline --&gt; Camera Camera *-- UniversalAdditionalCameraData UniversalAdditionalCameraData *-- ScriptableRenderer UniversalRenderer --|&gt; ScriptableRenderer ForwardRenderer --|&gt; ScriptableRenderer ScriptableRenderer *--- MainLightShadowCasterPass ScriptableRenderer *--- AdditionalLightsShadowCasterPass ScriptableRenderer *---- DrawObjectsPass ScriptableRenderer *---- DrawSkyboxPass ScriptableRenderer *---- PostProcessPass MainLightShadowCasterPass --|&gt; ScriptableRenderPass AdditionalLightsShadowCasterPass --|&gt; ScriptableRenderPass DrawObjectsPass --|&gt; ScriptableRenderPass DrawSkyboxPass --|&gt; ScriptableRenderPass PostProcessPass --|&gt; 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 &lt; 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 判定组件 -&gt; commonlua: 退出显微指认模式[Exit显微指认Mode()] commonlua -&gt; 显微镜: [Exit显微指认Mode()] 显微镜 -&gt; 成像控制: 关闭准星[Close准星()] 显微镜 -&gt; 成像控制: 获取准星对应模版的灰度值[xxx接口] 显微镜 -&gt; 玻片器材: 灰度值 玻片器材 -&gt; 玻片器材: 灰度映射指认结果 玻片器材 -&gt; 判定组件: 判定结果 判定组件 -&gt; 判定组件: 结算 @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>

页面列表

ITEM_HTML