UnitySRP原理初探
分析基于Unity官方提供的资料非常的珍贵SRP底层渲染流程及原理
原视频从profiler的角度解释了SRP内部运行原理,但看完依然有几个问题无法解答.
- 自定义的SRP RenderPipeline的Render是在哪里被调用的?
- context的函数是如何调用Unity内核的?
- 经过调试发现Render()函数并不是多线程调用的,为什么说SRP是多线程渲染.
为了解答上面几个问题,需要对程序做一个逆向分析.
下面是一段简单的渲染队列运行过程:
public class OpaqueAssetPipeInstance : RenderPipeline
{
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
foreach (var camera in cameras)
{
// Culling
camera.TryGetCullingParameters(out var cullingParams);
var cullreults = context.Cull(ref cullingParams);
// Setup camera for rendering (sets render target, view/projection matrices and other
// per-camera built-in shader variables).
context.SetupCameraProperties(camera);
// clear depth buffer
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, false, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Draw opaque objects using BasicPass shader pass
SortingSettings sst = new SortingSettings(camera){
criteria = SortingCriteria.CommonOpaque};
var settings = new DrawingSettings(new ShaderTagId("BasicPass"),sst);
var filterSettings = new FilteringSettings(RenderQueueRange.opaque);
context.DrawRenderers(cullreults, ref settings,ref filterSettings);
// Draw skybox
context.