ユーセンブログ

ゲーム開発に関することをたまに書きます

モバイルのGPUアーキテクチャ(mobile tile based rendering)について調べてみた

はじめに

モバイルでシェーダーを取り扱う際に、カットアウト(ピクセルの破棄)は使うなという話をよく聞きます。 なぜダメなのかという理由について、調べてみました。

結論としてはモバイル系で使われるGPUではカットアウトを使ってしまうとTBDRの利点が全く受けれなくなってしまい、結果としてかなりのオーバーヘッドが出てしまうためでした。

TBDR

TBDR( tile based rendering)というのは画面のピクセルを一定の大きさに切り分け、その単位ごとにライティングなどの処理を行うレンダリング方式のことです。 処理の順番としてはざっくり

  1. タイルに分割
  2. ジオメトリの前後関係から描画するポリゴンの決定(ジオメトリカリング)
  3. レンダリング

となります。

カットアウトがダメな理由

じゃあなんで、モバイルでカットアウトがだめかというと、理由はこれ。

Alpha testing, clip() and discard() are fragment shader operations. All of the speed advantages of TBDRs come from culling hidden surfaces at the geometry level. Once you introduce the ability to discard individual fragments, geometry culling doesn't work. (アルファテスト、clip()、およびdiscard()はフラグメントシェーダー操作です。 TBDRの速度の利点はすべて、ジオメトリレベルで非表示のサーフェスを選択することから得られます。個々のフラグメントを破棄する機能を導入すると、ジオメトリカリングは機能しません。)

ポリゴンの前後関係をジオメトリレベルで決定できるのがTBDRの利点なのにカットアウトではフラグメントで前後関係を決定してしまうのでTBDRの利点を生かせないどころか、

ジオメトリカリングをする→カットアウトがあるのでジオメトリカリングの結果を破棄してフラグメントでのZテスト(重い)となる

結果としてPCのアーキテクチャと異なりカットアウトが非常に重いということになるようです。

参考文献

game.watch.impress.co.jp

tech.drecom.co.jp

https://docs.unity3d.com/ja/current/Manual/SL-ShaderPerformance.html

light11.hatenadiary.com

http://research.tri-ace.com/Data/AndroidABC2014_Final.pptx