まず、マスクなしの通常の描画の場合はスプライトが1回のドローコールでレンダリングされているようで、特に不審な点はありませんでした。
対してMask InteractionをVisible Inside Maskに切り替え、シーン上にマスクオブジェクトを配置した場合は描画過程が変化し、まずマスクが描画されます。
マスクはカラーバッファへは書き込みを行わないため画面上の様子は変化しませんが、ステンシルバッファ上のマスク領域のステンシル値を1増やします。
次にスプライトが描画されますが、マスクなしの場合と異なりステンシル設定が追加されていて、リファレンス値がステンシル値以下の場合のみ描画するようになっています。
リファレンス値は1に設定されているので、ステンシル値が1以上...つまりマスク領域内にだけ描画されます。
最後にもう一度マスクが描画されます。このときもやはり画面上の様子は変化しませんが、マスク領域のステンシル値を1減らします。つまりマスクを解除しているということでしょうね。
つまりマスクありの場合はマスクの描画のためにレンダリングパスが2回増えることになります。ご質問者さんがおっしゃるように、マスクの分だけ描画コストは大きくなるでしょう。
一方マスクなしの場合ですが、ご質問者さんがお気になさっている画面外の描画については、そもそもビューポート外にはフラグメントが存在しないので、はみ出した領域についてはフラグメントシェーダーは起動しないはずです。
バーテックスシェーダーは全頂点について起動するでしょうが(バーテックスシェーダーの作動時点ではどの領域がビューポート外に出るか未確定なため)それはマスクありの場合でも条件的に同じはずであり、速度差には影響しないでしょう。
また、「Occlusion culling - Unity マニュアル」によると...
By default, Cameras perform frustum culling, which excludes all Renderers that do not fall within the Camera’s view frustum.
カメラはデフォルトでカメラの視錐台から外れたレンダラーを除外するフラスタムカリングを行います。
とのことですので、完全にカメラの視界外にあるオブジェクトはレンダリング自体がスキップされるでしょう。
というわけで、画面外を描画させないためにマスクを使うというのは、どうもデメリットしかなさそうに思われました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/23 04:53