精選文章

SmallBurger Asset Home

  SmallBurger

2018年9月13日 星期四

客製化自己的Unity LWRP

說實在的,完全客製化一個自己的SRP,又能兼顧效能及功能並不容易…
我發現在ScriptableRenderPipeline\TestProjects\LWGraphicsTest裡面的
045_CustomLWPipe.unity可以做到某種程度的客製化。
在其中的CustomLWPipe.cs中展示了可以自行設計加入想要的Pass流程,
這個範例目前只用到了以下幾個pass來完成繪圖:

  1. SetupForwardRenderingPass
  2. CreateLightweightRenderTexturesPass
  3. SetupLightweightConstanstPass
  4. RenderOpaqueForwardPass

然而LWRP如何做到使用你的客製流程,答案是利用了IRenderSetup,
他會在畫每一個Camera的時候,利用GetComponent來取得IRenderSetup,
如果有的話,就會取代掉原本的DefaultRendererSetup,這樣他可以做到
每個Camera使用不同的IRenderSetup,非常有彈性,雖然我個人是覺得
這樣有效能的疑慮。

目前這個範例並沒辦法處理陰影,但透過一些些流程,就可以支持,細結可以參考
DefaultRendererSetup,流程如下:

  1. 在Init函式加入陰影相關pass及相關的renderTexture
    ...
    private DepthOnlyPass _depthOnlyPass;
    private RenderTargetHandle _depthTextureHandle;
    private DirectionalShadowsPass _directionalShadowPass;
    private RenderTargetHandle _directionalShadowmapHandle;
    private ScreenSpaceShadowResolvePass _screenSpaceShadowResovePass;
    private RenderTargetHandle _screenSpaceShadowmap;
    ...
  2. 在Setup函式設定及加入Pass:

    if (_directionalShadowPass != null)
    {
      _directionalShadowPass.Setup(_directionalShadowmapHandle);
      renderer.EnqueuePass(_directionalShadowPass);
    }
    renderer.SetupPerObjectLightIndices(ref cullResults, ref renderingData.lightData);
    RenderTextureDescriptor baseDescriptor = ScriptableRenderer.CreateRTDesc(ref
      renderingData.cameraData);
    renderer.EnqueuePass(m_SetupForwardRenderingPass);
    //一定要在 m_SetupForwardRenderingPass之後…
    if (_depthOnlyPass != null)
    {
      _depthOnlyPass.Setup(baseDescriptor, _depthTextureHandle, SampleCount.One);
      renderer.EnqueuePass(_depthOnlyPass);
    }
    if (_screenSpaceShadowResovePass != null)
    {
      _screenSpaceShadowResovePass.Setup(baseDescriptor, _screenSpaceShadowmap);
      renderer.EnqueuePass(_screenSpaceShadowResovePass);
    }
我覺這是一個讓你可以快速體驗SRP又可以享受LWRP的複雜功能的範例
(尤其是影子),大家有空可以自行下載ScriptableRenderPipeline來玩玩看。
這是相關整行後的結果:



Dream continues in...

沒有留言:

張貼留言