プロジェクトをURPにアップグレードする際に発生した問題

UntiyがSRPを発売してからほぼ1年が経ちました。その中で、LWRPは2018年末に生産準備が整い、製品を製造する準備ができていることが正式に発表されたため、URPに名前が変更されましたが、HDRPはまだ2019.4からフルバージョンに到達します。しかし、私の意見では、URPは生産準備が整っているとは言えず、まだ玩具から生産段階に移行中です。また、Unityの担当者の技術的なルートがあいまいで、左右に揺れていると感じることもあります。たとえば、Unity 2018の新しいCamera.AddCommandBufferは、Unity 2019で廃止され、Render Feature / ScriptableRenderPassに置き換えられたカスタムレンダリングに使用されますが、これも実験段階です。

SRPが変更なしでプロジェクトのパフォーマンスを直接改善できるかどうか、答えは、CPUのパフォーマンスをGPU準備段階まで約10%直接低下させることができるということです。GPUのレンダリングパフォーマンスを直接改善することはできません。照明を使用せず、Opengl ES2.0などのローエンドマシンを使用するプロジェクトの場合、基本的にGPUパフォーマンスの改善はありません。

現在使用されているSRPに多数のバグがある2つの例を見てください

1. [GetTransformInfoExpectUpToDateを呼び出すには、最初にRendererUpdateManager.UpdateAllを呼び出す必要があります。]説明できない組み込みのレンダリングエラー。自分で変更することはできません。

公式号リンク

https://issuetracker.unity3d.com/issues/errors-message-at-editor-play?_ga=2.202176470.695125147.1571176891-1511937231.1511185188

2.レンダリングコマンドBlitを使用した後、RenderTargetは元のRenderTargetを自動的に復元できません。以前のCommandBufferで発生したことのないSetRenderTargetを手動で復元する必要があります。

プロジェクトの途中でSRPを直接最適化できる場所に切り替えます

1.カメラカリングの最適化

 

https://connect.unity.com/p/unityzhi-zuo-ren-zhuan-chang-unity-aaayou-xi-shen-du-you-hua-zhu-ti-yan-jiang

公式の最適化リファレンスによると、SRPを使用した後、カメラのカリング(トリミング)動作を制御できます。プロジェクターに基づいて独自のシャドウカメラがあるプロジェクトの場合、メインカメラのカリング結果を再利用できます。モデルRTの場合UIのカメラでは、何もできません。カリング

2.カメラスタックの最適化

SRPは複数のカメラの実装を放棄し、複数のカメラを使用できなくなりました(たとえば、プロジェクトには1つのゲームプレイ、1つのHUD、1つのUIカメラがあります。公式のSRPテンプレートを使用すると、UIカメラの背景色がシーンコンテンツをカバーします) 、理由

カメラを1つだけ使用する場合は、レンダリング結果をBackBufferに直接書き込むことができます。

複数のカメラがある場合、2番目のカメラはレンダリングする前に最初のカメラの結果をキャンバスに塗りつぶす必要があるため、少なくともRenderTextureの一時バッファーが必要であり、さまざまなビューポートなどに合わせてトリミングする必要があります。 backBufferの書き込みも遅延します

公式文書がカメラスタックを放棄する理由

https://docs.google.com/document/d/1GDePoHGMngJ-S0Da0Fi0Ky8jPxYkQD5AkVFnoxlknUY/edit

3.UIオーバードローの最適化

同じカメラを使用してUIを描画した後、UIにテンプレートテストを追加して、シーンの一部からUIをブロックすることを検討できます。そうすると、シーンが描画されない場合があります。

 

4.UIバッチマージ(Opengl 3.0+ Unity2019.2 +とSRPBatcher)

シーンの特殊効果の場合、SRPバッチャーは基本的に見落とされます。彼はCbufferの容量に制限があります。

UIの場合、シェーダーをグローバルにカスタマイズする場合は、SRP Batcherを使用できますが、まだ実験段階です。

 

最後に、Unity2019で関数Camera.AddCommandBufferがScriptableRenderPassに置き換えられた後にXRayを実装する方法について説明しましょう。

CommandBufferを使用する場合、camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque、m_XRayBuffer)のみが必要です。

次に、XRayBuffer.drawRenderer(renderer、XrayMat)

 

2019年には、達成するためにXrayRenderPassFeatureクラスを作成する必要があります

パブリッククラスXRayRenderPassFeature:ScriptableRendererFeature

 

ScriptableRendererFeatureには、実装する2つのインターフェイスがあります

Creata()は、特定のX線パスを実装するインターフェイスを作成します

AddRenderPasses(ScriptableRendererレンダラー、ref RenderingData renderData)は、Chuangjiaoのパスをレンダラーキューに追加します

 

XRayRenderPassFeatureにCustomRenderPassを実装します:ScriptableRenderPassを使用して、特定のXrayロジックを記述します

Configure(CommandBuffer cmd、RenderTextureDescriptor cameraTextureDescriptor)準備フェーズ

Execute(ScriptableRenderContext context、ref RenderingData renderData)レンダリングフェーズ

FrameCleanup(CommandBuffer cmd)クリーニングフェーズ

 

基本的な実装は構成にあります

 

CommandBuffer xraycmd = CommandBufferPool.Get(m_profilerTag); xraycmd.DrawMesh(m_drawMesh, m_xrayTarget.transform.localToWorldMatrix, m_xrayMaterial); context.ExecuteCommandBuffer(xraycmd); CommandBufferPool.Release(xraycmd);

 

一般的なプロセスでは、レンダラーはパスのrenderPassEventと、スカイボックス、ポイントライト、深度などの他の組み込みパスに従って並べ替え、レンダリングの前、後、レンダリング後にインターフェイスを呼び出します。

 

公式のSRPFPSデモに基づいてXRayを実装するために1つ追加します

https://github.com/Unity-Technologies/UniversalRenderingExamples

1.FpsSetupプレハブで作成したばかりの機能を追加します

2.簡単なZTestGreater Shaderを作成して、遮蔽された部分を描画します

 

Shader "Unlit/XrayShader" { SubShader { Tags { "RenderType"="Opaque" "LightMode"="LightweightForward" } LOD 100 Pass { ZTest greater offset -1,-1 HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); return o; } float4 frag (v2f i) : SV_Target { return float4(1,0,0,1); } ENDHLSL } } }

3.サンプルキューブをシーンに配置し、XRayTargetという名前を付けます

最後にゲームを実行します

 

最後に、カスタムScriptableRendererFeatureを使用する場合は、対応するエディターコードも自分で作成する必要があります。これは、以前よりもはるかに面倒です。

 

SRPを自分で作成する場合、RenderPassFeatureは自分でパスリストを維持する必要があります。または、カスタムForwardRendererを実装するだけで、多くの関数の繰り返しを減らすことができます。

おすすめ

転載: blog.csdn.net/mango9126/article/details/112010895