CommandBuffer携带一系列的渲染命令,依赖相机,用来拓展渲染管线的渲染效果。
·ScriptableRendererFeature(ver.2022)(shader中的_MainTex对应的texture类型(需要手动创建)是当前相机屏幕的RenderTexture数据)
在ScriptableRendererFeature中对于屏幕渲染可以通过一个临时的RenderTexture来渲染,对于整体的的渲染流程来说分为几个步骤
(CommandBuffer的渲染是用Cmd.Blit来完成的在ScriptableRendererFeature上)
- 在初始化阶段的时候申请一个临时的RenderTargetHandle(在2022是RTHandles,RTHandles整合了一些RenderTargetHandle之外的一些东西)
RTHandles.Alloc(“_name”,”_name”)
第一个_name是把该string强制转换成一个RenderTargetIdentifier,后面则是申请的名字,两者的名字并不用一致,但是第一个string决定了全局Shader中的变量名字
- 在准备阶段也就是OnCameraSetup
在准备阶段可以获取相机的数据,比如说相机的RenderTargetIdentifier则是可以通过renderingData.cameraData.renderer.cameraColorTargetHandle.nameID来获取的,相机的对象都可以在这里获取,这样可以减少访问消耗(存疑)
- 在Execute中进行渲染
在Execute中进行渲染,使用Blit进行
首先要创建一个新的CommandBuffer,可以通过CommandBufferPool中通过get(“Name”)来新建和获取一个CommandBuffer,这样比普通的new减少消耗
使用Cmd的Blit,在ScriptableRendererFeature中的Blit需要对象的RenderTargetIdentifier来进行渲染,一般是从src到dest,也就是通过src的图像进行渲染,然后把结果保存到dest上,其中src的图像则是在shader中对应了MainTex,若非该函数,则对应的无效,src将会无用()
申请一个临时的RT需要一个RTHandles,一个RenderTextureDescriptor,这个变量包含了所有的创建一个RenderTexture的数据,如果但是如果要取出RTHandles.rt的RenderTexture不能直接去使用,而是要把他渲染到一个已有的RenderTexture上
记得用Context提交cmd执行
最后记得清理在该函数申请的TemporaryRT和CommandBuffer
4.OnCameraCleanup 清理一些不需要相机时的数据
ScriptableRendererFeature的Pass每帧都会调用一次,走一次渲染流程