Renderer と Material Priority
レンダーパイプラインは、画面に正しい順序でオブジェクトが表示されるように、レンダリングの前にオブジェクトをソートしなければなりません。レンダーパイプラインはカメラから遠いオブジェクトを先に描画して、その上にカメラに近いオブジェクトを描画しなければなりません。その順序が正しくないと、カメラから遠いオブジェクトが、カメラに近いオブジェクトの前に表示されてしまいます。
ビルトイン Unity レンダーパイプラインは、レンダリングモード と renderQueue に応じて、ゲームオブジェクトをソートします。HDRP はレンダーキューを別の方法で使い、その場合 HDRP Materials はレンダーキューを直接展開しません。代わりに HDRP は、マテリアル によるソートと レンダラー によるソートの、2 つの制御方法を使います。
HDRP はこれら 2 つのソーティング法を一緒に使って、レンダーキューを制御します。HDRP はレンダーキューの順序を計算するために、以下を実行します。
- メッシュをマテリアルを共有するグループにソートします。
- 各 Materials の Priority を使って、これらの Material グループのレンダリング順序を計算します。
- マテリアルグループを各メッシュレンダラーの Priority プロパティーを使ってソートします。
その結果キューには、最初にマテリアルの Priority で、そして次にそれぞれのメッシュレンダラーの Priority でソートされた、ゲームオブジェクトのリストが反映されます。
マテリアルによるソート
Transparent Surface Type を持つマテリアルには、異なるマテリアルを使うメッシュのグループをソートするために使える、Sorting Priority プロパティーがあります。このプロパティーは、 -100 から 100 の間に固定された整数値になります。
新しいマテリアルを最も低いプライオリティーに容易に割り当てることができるように、HDRP はマイナス値をサポートしています。これは、最も低いプライオリティーが既に別のマテリアルに使用されているときに、新しいマテリアルを最も低いプライオリティーに割り当てたい場合に便利です。この場合、他のマテリアルすべてのソートプライオリティーを 1 つずつ増やす代わりに、新しいマテリアルのプライオリティーをマイナス値にすることができます。
HDRP はシーン内で異なるマテリアルを使うゲームオブジェクトをソートするために、Sorting Priority を使います。HDRP はまず初めに、Sorting Priority 値が最も低いマテリアルをレンダリングします。つまり、たとえ Sorting Priority 値がより高いマテリアルを使うメッシュがカメラからより遠いところにあったとしても、値の低いマテリアルを使うものの前に表示されます。
例えば以下のシーンには、2 つの異なるマテリアルを使うスフィアが 2 つ (Sphere 1 と Sphere 2) 含まれています。見ての通り、Sphere 1 は Sphere 2 に比べてカメラにより近いところにあります。
マテリアルの Sort Priority が同じであるとき、HDRP はそれらを同等に扱い、カメラからの距離に基づいてレンダリング順序を決めます。この例では、両方のマテリアルの Sort Priority は 0 に設定されているため、HDRP はカメラからの距離で定義される順序でレンダリングを実行し、その結果 Sphere 1 が Sphere 2 の前に表示されます。
異なるマテリアルの Sort Priority プロパティーが同じでなければ、HDRP はプライオリティーの高いマテリアルを使うメッシュを、プライオリティーの低いマテリアルを使うメッシュの前に表示します。これを実現するため、HDRP はまず最初にプライオリティーの低いマテリアルを使うメッシュを描画してから、プライオリティーの高いマテリアルを使うメッシュを、既に描画されたメッシュの上に描画します。例では、Sphere 2 の Sort Priority が 1 に設定されており、HDRP はまず最初に Sphere 1 をレンダリングしてから、Sphere 2 をレンダリングします (Sphere 1 の上に描画します)。その結果、Sphere 1 の方が Camera に近いのにも関わらず、Sphere 2 は Sphere 1 の前に表示されます。
⚠ マテリアルで Depth Write が有効になっていると、Sort Priority は無視されますので、注意してください。 これは Shader で実行される Depth Test が、マテリアルの Sort Priority をオーバーライドするためです。
レンダラーによるソート
メッシュレンダラーには、シーン内の同じマテリアルを使うレンダラーをソートする、Priority プロパティーがあります。
同じマテリアルを使うゲームオブジェクトのレンダリング順序を変更したいときは、メッシュレンダラーの Inspector にある Priority プロパティーを使います。Priority は、シーン内のレンダラーのレンダリング順序に影響を与えることができる、レンダラーごとのプロパティーです。
HDRP は Priority 値がより高いレンダラーを、Priority 値がより低いレンダラーの前に表示します。
また、スクリプト内のメッシュレンダラーに対するレンダラー Priority は、rendererPriority 値を設定して編集することができます。
使用例
以下のシーンには、同じマテリアルを使うスフィアが 2 つ (Sphere 1 と Sphere 2) 含まれています。見ての通り、Sphere 1 は Sphere 2 に比べて Camera により近いところにあります。
メッシュレンダラーのレンダラー Priority が同じであるとき、HDRP はそれらを同等に扱い、カメラからの距離に基づいてレンダリング順序を決めます。この例では、両方のメッシュレンダラーのレンダラー Priority は 0 に設定されているため、HDRP はカメラからの距離で定義される順序でレンダリングを実行し、その結果 Sphere 1 が Sphere 2 の前に表示されます。
異なるメッシュレンダラーの Renderer Priority プロパティーが同じでなければ、HDRP はプライオリティーの高いメッシュレンダラーを、プライオリティーの低いものの前に表示します。これを実現するため、HDRP はまず最初にプライオリティーの低いメッシュを描画してから、プライオリティーの高いメッシュを、既に描画されたメッシュの上に描画します。例では、Sphere 2 の Renderer Priority が 1 に設定されており、HDRP はまず最初に Sphere 1 をレンダリングしてから、Sphere 2 をレンダリングします (Sphere 1 の上に描画します)。その結果、Sphere 1 の方が Camera に近いのにも関わらず、Sphere 2 は Sphere 1 の前に表示されます。