zoukankan      html  css  js  c++  java
  • 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

    人生当苦,笑着看看
  • 相关阅读:
    【转】点集 凸包
    【转】Word中使用Endnote很卡解决方案
    【转】一个程序员的面试经验之谈
    【转】 std list/vector sort 排序
    std::numeric_limits<int>::max() error C2589: '(' : illegal token on right side of '::' 解决办法
    【转】Log4cpp 封装
    【转】 log4cpp 的使用
    遍历目录 删除目录中包含指定字符的文件和文件夹
    mysql主从复制架构
    mysql分区功能详细介绍,以及实例
  • 原文地址:https://www.cnblogs.com/BaiPao-XD/p/13751661.html
Copyright © 2011-2022 走看看