XDGEUnity XDGEPipeLine
XDGEUnity XDSRP PipeLine (一)
(后续标题为XDGE_XXXX, XDGEUnity_XXXX, XDGEUE_XXXX)
一、Unity PipeLine 说明
SRP,LWRP,HDRP、CommandBuffer
SRP为一个上层代码驱动的渲染管线,Unity将许多绘制命令和绘制状态进行了封装,并通过RenderContext和CommandBuffer暴露给C#等上层代码
PipelineAssets
用于产生Pipeline,同时存放当前的配置(这个按自己的要求来),XDRender是用来配置可以用到的管线。
Pipeline
这里的PileLine我们可以只当作转发,从而实现多个管线并存(多个Camera)
LWRP,HDRP
LWRP为轻量级,HDRP比较高(不仅仅是Feature多,整个代码结构也不一样,比如存在类似RenderGraph等等)
LWRP和HDRP都依赖了CoreRP的公共库。
SRP: 这里对应了LWRPScriptRender, 其中又衍生出Forward
CommandBuffer的执行
1、CommandBuffer会收集我们通过CommandBuffer执行的命令,并在RenderContext执行该命令缓存区时,执行收集的命令。
2、当然我们也可以自己做一个事件或者CMDQueue机制,来收集这些CommandBuffer,按需执行。
CommandBuffer和RenderTexture
这里RenderTexture在Unreal源码中也有类似的处理,RTHandle(这里XDRender又封装了一下,可以理解为句柄或者唯一ID标识)
1、在我们执行SetRenderTarget, Blit等等,经常是需要RT的。这里Unity会将RenderTexture退化为RenderTargetIdentifier
2、在利用CommandBuffer分配RT时注意这个是临时的,当Exe后就失效了。
比如XDRender中CSMShadow使用
RTHandle vRT1 = ShadowRTSystem.AllocationRT("_gShadowMapTextureColor" + i, shadowResolution, shadowResolution,24);
//////XDRenderHandleSystem:
int Skeyid = Shader.PropertyToID(pShaderKeyName);
_cmd.GetTemporaryRT(Skeyid,pWidth,pHeight,pDepth);
return new RTHandle(Skeyid,Skeyid);
OK ......以上就是一个大概,剩下就是BeginHandle.
题外
1、为何要这样?
a、能够将一套思路搞三个(目前就做了两个,博客这里就只放理论和Unity/UE实现)
b、这个是最关键的,将很经典或者能普遍的Feature集成于XDRender.
c、自己的比较自由和克制处于平衡
2、如何这样?
a、从Pipeline(这个是Unity原始带的,所以XDRender这部分起点相当于CoreRP)开始减少依赖Unity扩展出 其他Render-Package