XDGEUnity XDGEPipeLine

XDGEUnity XDSRP PipeLine (一)

image-20200929173821306

image-20200929173831780

(后续标题为XDGE_XXXX, XDGEUnity_XXXX, XDGEUE_XXXX)

一、Unity PipeLine 说明

SRP,LWRP,HDRP、CommandBuffer

SRP为一个上层代码驱动的渲染管线,Unity将许多绘制命令和绘制状态进行了封装,并通过RenderContext和CommandBuffer暴露给C#等上层代码

PipelineAssets

用于产生Pipeline,同时存放当前的配置(这个按自己的要求来),XDRender是用来配置可以用到的管线。

image-20200929194032098

Pipeline

这里的PileLine我们可以只当作转发,从而实现多个管线并存(多个Camera)

image-20200929194119914

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

image-20200929193215442

image-20200929193239621

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

大致结构

Shader结构

image-20200929195337178

代码结构

image-20200929195452388

人生当苦,笑着看看
原文地址:https://www.cnblogs.com/BaiPao-XD/p/13751661.html