我發現在ScriptableRenderPipeline\TestProjects\LWGraphicsTest裡面的
045_CustomLWPipe.unity可以做到某種程度的客製化。
在其中的CustomLWPipe.cs中展示了可以自行設計加入想要的Pass流程,
這個範例目前只用到了以下幾個pass來完成繪圖:
- SetupForwardRenderingPass
- CreateLightweightRenderTexturesPass
- SetupLightweightConstanstPass
- RenderOpaqueForwardPass
然而LWRP如何做到使用你的客製流程,答案是利用了IRenderSetup,
他會在畫每一個Camera的時候,利用GetComponent來取得IRenderSetup,
如果有的話,就會取代掉原本的DefaultRendererSetup,這樣他可以做到
每個Camera使用不同的IRenderSetup,非常有彈性,雖然我個人是覺得
這樣有效能的疑慮。
目前這個範例並沒辦法處理陰影,但透過一些些流程,就可以支持,細結可以參考
DefaultRendererSetup,流程如下:
- 在Init函式加入陰影相關pass及相關的renderTexture
...
private DepthOnlyPass _depthOnlyPass;
private RenderTargetHandle _depthTextureHandle;
private DirectionalShadowsPass _directionalShadowPass;
private RenderTargetHandle _directionalShadowmapHandle;
private ScreenSpaceShadowResolvePass _screenSpaceShadowResovePass;
private RenderTargetHandle _screenSpaceShadowmap;
... - 在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);
}
…
(尤其是影子),大家有空可以自行下載ScriptableRenderPipeline來玩玩看。
這是相關整行後的結果:
Dream continues in...
沒有留言:
張貼留言