イベント
[GDC 2024]Armが推奨するレイトレーシング時代のスマートフォンゲームグラフィックスとは?
そもそも,2024年の現状では,レイトレーシング対応GPU搭載のSoCを採用したスマートフォンがまだまだ少ない。だが,2023年発売の「iPhone 15 Pro」シリーズによって,状況は変わってくるかもしれない。iPhone 15 Proの搭載SoCである「A17 Pro」は,レイトレーシング対応なのだ。
そこで気になるのは,スマートフォン向けゲームにおけるレイトレーシングの実装は,PCやPlayStation 5,Xbox Series X|Sと同じでいいのだろうかという点である。GDC 2024で行われたArmのセッション「Realistic Mobile Graphics with Optimized Ray Tracing」は,まさにそうした話題を取り上げたものだ。その概要をレポートしよう。
メモリの遅さに悩まされるスマートフォン向けGPU
スマートフォン向けのSoCのGPUは,世代を経るごとに性能が向上しているのは間違いない。しかし,PCやゲーム機のGPUと比べて決定的に及ばないのが,メモリの性能だ。分かりやすくいえば,メモリアクセス速度が遅いのである。
省電力性能が何よりも重要視されるスマートフォンにおいては,メインプロセッサであるSoCの省電力はもちろん,動作中は常に電力を消費するメモリ周りにも,大きな負荷(=高い消費電力)はかけたくない。そのためスマートフォン向けSoCのメモリインタフェースは,いまだに64bit(16bit×4ch)程度だ。一般的なPCのメインメモリインタフェースは128bit(64bit×2ch)接続で,PS5のようなゲーム機は256bit接続,PC向けハイエンドGPUのメモリインタフェースになると384bit以上であるのに比べると,かなり狭い。メモリバス帯域幅も,スマートフォンの多くは50GB/s前後が多く,PS5の448GB/sに比べると,わずか9分の1にすぎない。ほかのゲームプラットフォームと比較すると,スマートフォンのGPUは,とてつもなくメモリアクセスが遅いのである。
メモリアクセスが遅い環境でGPUに生じる問題は,3Dモデルを画面に描画するときに,構成ピクセルを描画すべきかどうかを判定する深度判定処理に時間がかかることだ。いわゆる,Zバッファを使った「ピクセル単位の描画可否判定」(Zテスト)である。これは激しくメモリにアクセスする処理系であるため,スマートフォン向けGPUでは,PCやゲーム機とは少し異なるZテストの処理を採用して対応するのが定番だ。それは,「まとまったZバッファを必要としない,ピクセル単位の描画可否判定」である。
細かい経緯は省くが,現在のGPU業界では「スマートフォン向けGPUにおいては,まとまったZバッファを使うことなくメモリアクセスを最小限にして最大速度を得るには,画面を16×16ピクセルのようなタイル単位に並列描画する『タイルベースレンダリング』を採用したほうがいい」と結論づけられている。そのためスマートフォン向けGPUは,ほぼすべてがタイルベースレンダリングを採用しているのだ。
実際の処理では,Zテストをタイル単位で用意したキャッシュメモリ内で済ませることで,狭いメモリバスの先にあるメインメモリへのアクセスを,極力抑えるのである。
ここまでを踏まえたうえで,レイトレーシングの話題に進もう。レイトレーシングという技術も,とくにメインとなるレイとポリゴンの衝突判定である交叉判定が,処理系としてはメモリ空間に対するデータ探査が中心となるので,メモリアクセスは必然的に激しくならざるを得ない。
そうなると,常識的に考えれば「スマートフォンでレイトレーシングなんぞをやるなんて狂気の沙汰」となるはずなのだが,「それでもやるとしたら,どうやるべきか」というのが,このセッションの主題というわけだ。
Vulkanにおける2つのレイトレーシング技法
Android系OSで,標準的なグラフィックスAPIとなっている「Vulkan」では,レイトレーシングを行う方法に2つの選択肢がある。
ひとつは,あらゆる種別のシェーダからインラインレイトレーサを記述できる「VK_
2つめは,レイ生成と交叉判定,シェーダの動員までをGPUで行う「レイトレーシング描画サブシステム」を,まるまる利用する「VK_
現状のMali系GPUドライバソフトは,ひとつめの手法でしかレイトレーシング技術を利用できないそうで,今回の技術デモも,VK_
Lista氏らが開発したデモは,鏡像(Reflection),影(Shadow),屈折(Refraction),環境遮蔽(Ambient Occlusion)の各表現にレイトレーシング技術を採用しており,1ピクセルあたり,0.5〜5.5本程度のレイをキャストして描画したとのこと。
なお,このデモ自体は公開されておらず,公式の映像素材もなかった。そこで,GDC 2024のEXPO会場にあったArmブースで,Vivo製スマートフォン「X100」上で動作していたデモ画面を直撮りした映像を示そう。動画内で説明しているのは,Lista氏自身である。
デモの仕様は,メイン描画ターゲットの解像度が1600×900ピクセルで,総描画ポリゴン数は約166万,動的光源数は10で,総3Dオブジェクト数は約1100とのこと。
最新のPC向けゲームグラフィックスと比較すれば地味でシンプルだが,スマートフォン向けと考えれば,相応に美しく仕上がっているとは思う。
レイトレーシングとそれ以外のレンダリング法をミックスする
Lista氏らが開発したデモでは,表現要素において,レイトレーシングを
- 活用する事例
- 活用しない事例
- 両方を使い分けるハイブリッド事例
という3種類を実装しており,それらを切り換えて性能を比較する設計となっている。まずは,レイトレーシング技術を活用した分かりやすい表現として,鏡像を見ていこう。
デモ内でレイトレーシングを活用しない例では,レイトレーシング技術を活用しない鏡像表現の実装として,近代ゲームグラフィックスでは定番となっている画面座標系の疑似レイトレーシングテクニック「Screen Space Reflection」(SSR)を採用した。
SSRでは,シーンの描画結果の深度情報分布をシーンの疑似立体構造に見立てて,描画対象のピクセルから,視線の反射方向に疑似的なレイをキャストする。そのレイが,疑似立体構造に衝突した場合,衝突先の深度値に対応するピクセル値を,鏡像に描くものとして採用する。
簡単に言うと,「注目している描画対象のピクセル位置から,視線の反射方向にある描画結果をコピペしてくるようなもの」が,SSRによる疑似鏡像であると理解すればいい。
SSRで描画する場合,深度情報分布から疑似再現した立体構造へのアクセス範囲は,おおむね局所的なものになる。鏡像は,そもそも視線の反射方向にあるものが映り込みやすいので,その方向にある立体構造へのアクセスが集中するからだ。
したがって,キャッシュメモリサブシステムが優秀な現代的なGPUの場合,この領域に対して行う疑似レイトレーシングは,高確率でキャッシュ上で処理されやすい。つまり,キャッシュへのアクセスで代行できるため,メインメモリへのアクセスがかなり少ない疑似レイトレーシングを行える。
ただ,SSRは,画面内コピペで疑似鏡像を作り出しているような手法だ。そのため画面外の情景は,鏡像として映り込ませることができない。プレイヤーの視点変更に連動して,実像が画面外に消えると,鏡像も同期して消失してしまう。コピペ元が消えているのだからしかたない。
そこで,開発チームが今回のデモに実装したのが,SSRにレイトレーシングを組み合わせたハイブリッド手法的な鏡像生成だ。
具体的には,SSRシェーダが画面外の情景を参照すると判断した場合に限り,レイトレーシングを行うように設計したのである。SSRの弱点をレイトレーシングで補う戦略だ。
レイトレーシング時におけるレイのキャスト開始位置は,SSR生成用の疑似レイが画面外を参照した位置からとする。また,SSR法において深度情報分布から疑似再現した立体構造は,その3Dシーンをレイトレーシング用に構築した「Bounding Volume Hierarchy」(以下,BVH)とは,それなりの誤差があるので,その補正をしっかり行う必要がある。これを行わないと,「SSR法で描画された鏡像と,レイトレーシング法で描画された鏡像に,不自然な境目が生じてしまう」とLista氏は述べていた。
ハイブリッド手法の長所は,SSR法による鏡像の消失を克服できること。見た目にも分かりやすいが,それ以外に性能面でのメリットもある。それは,レイトレーシング法におけるレイの発射位置を,描画対象ピクセル位置からではなく,SSR法を断念した位置に動かせるところだ。これにより,描画対象ピクセル位置に近いオブジェクト群(=レイが交差する可能性はほぼない)への交叉判定を完全に省略できる。
2つめの長所は,描画対象ピクセル位置に近いオブジェクト群の鏡像が,草木や毛髪のようなオブジェクト群だった場合,それらの鏡像を超低コストで描画できてしまうところだ。
草木や毛髪は,「透明要素を含んだテクスチャ」をポリゴンに貼り付けて,形状を表現している3Dオブジェクトであることが多い。そのため,正確な交叉判定を行おうとすると,テクスチャの内容を精査する必要がある。レイがポリゴンに衝突していても,その衝突先が,テクスチャの透明要素であれば,衝突していないと判断しなければならないからだ。
しかし,テクスチャ内容の精査とはメモリアクセスそのものなので,できれば避けたいところ。これらの処理系を大きく省略して,実質コピペ的な処理で鏡像が生成できるのであれば,かなりの負荷を低減できるのだ。
Lista氏は,さらなる性能向上を狙うには,「ハイブリッド法のレイトレーシング部分は,『Subgroup Operations』(サブグループ処理)を活用したほうがいい」と述べていた。サブグループ処理というのは,WarpやWavefrontといったデータスレッドに収まる範囲で,共有メモリなどに頼ることなしにスレッド同士が直接データのやりとりを行えるような仕組みを定義することを示す。
次の写真は,SSR法,レイトレーシング法,ハイブリッド鏡像の品質を比較したものだ。
SSR法による鏡像は,そもそも鏡像の生成元となる視線の位置が数理的に正しくないので,映像品質は低い。レイトレーシングが使えるときにはレイトレーシングだけで鏡像を生成したほうが,品質面で絶対にいいのは間違いない。よって,ハイブリッド的な手法が,PCやゲーム機で採用されるケースは少ないと思われる。
ただ,広視野角でなおかつ広大な水面への鏡像生成のような場合,負荷軽減に役立つかもしれない。
次のグラフは,ここまでに解説した鏡像生成手法ごとの処理時間とGPUを使用した処理のサイクル数を示したものだ。
黒い折れ線グラフが処理時間(ms)で,色つきの棒は処理サイクル数(GPU Active)を表している。ただ,講演者によるスライド作成時の問題か,黒い折れ線グラフは,本来意図した値になっていないようだ。そのため,本稿では色つきの棒グラフのみに注目する。棒グラフが低いほど,処理性能が高い(=処理に要するGPUのサイクル数が少なくて済む)ことを意味する。
左端から順番に,SSR法による描画(水),レイトレーシング法による描画(濃紺),最適化前の「SSR+レイトレーシング」ハイブリッド法による描画(黄),レイトレーシング位置を補正する最適化を施したハイブリッド法による描画(黄緑),さらにサブグループまで最適化したハイブリッド法による描画(橙)となる。最適化前のハイブリッド法が一番負荷率が高く,最適化によって10%ほど負荷が低減しているのが見て取れる。
ハイブリッド手法は影にも使える
そのほかにもLista氏は,技術デモにおける影生成にも,SSR法によく似た疑似レイトレーシング風の「画面座標系の影生成」と,レイトレーシング法,それらの組み合わせによるハイブレッド法を実装したという。
疑似レイトレーシング風の影生成は,深度情報分布から疑似立体構造を再現するところまでは,SSR法と同じだ。この疑似立体構造に対して,描画対象ピクセルの場所から,視線の反射方向に疑似レイトレーシングを行うのがSSR法である。画面座標系の影生成では,描画対象ピクセルから光源方向へレイをキャストして,遮蔽物に当たれば影色とする。
一方,レイトレーシング法による影生成は,描画対象ピクセルから光源に向かってレイをキャストして,何かと交差したら描画対象ピクセルは影色とする手法だ。
ハイブリッド法は,画面座標系の影生成による疑似レイトレーシングが画面範囲外に到達したら,鏡像生成と同じく,そこから光源方向にレイトレーシングを継続させる。
ハイブリッド法におけるレイトレーシングのレイキャスト方向や位置の補正,サブグループ最適化の適用については,これまた鏡像生成と同じだ。
影生成手法による性能計測結果は以下のとおり。こちらは,折れ線グラフも棒グラフも正しそうなので両方を見ていこう。
棒グラフのサイクル数を見ると,ハイブリッド手法がそれほど軽減できているようには見えない。しかし,折れ線グラフの処理時間に注目すると,ハイブリッド手法は鏡像生成と同じく,すべての最適化を適用するとかなり処理時間を短縮できているのが見て取れる。とくに,鏡像時よりも,サブグループ最適化の恩恵が強く表れているのが興味深い。
スマートフォン向けゲームでレイトレーシングを実装するときの3大チップス
最後にLista氏は,スマートフォンゲーム向けゲームグラフィックスでレイトレーシング法を活用するにあたってのチップスを3つ紹介した。
ひとつは,シーンに配置する3Dオブジェクトのうち,「透明要素を含んだテクスチャ」で物の形状を表現している3Dオブジェクトの取り扱いについてだ。
先述したように,草木や毛髪がこの種の3Dオブジェクトだが,これらの交叉判定を,テクスチャ内容を精査して行うのか。それともポリゴン形状で行ってしまうのか,あるいは交叉判定の対象外として無視するのか。やり方はいろいろ考えられる。
これについてLista氏は,「得たいグラフィックス表現に応じて,適宜調整する必要がある」と述べていた。形状の正確さを重んじるならば,テクスチャ内容を精査して交叉判定を取るべきだ。しかし,テクスチャの参照は,メモリアクセスと同義なので,途端にスマートフォン向けGPUの処理性能が低下するであろうことは冒頭で述べたとおり。
2つめのチップスは,アニメーションする(≒変形する)3Dオブジェクトの扱いだ。
たとえば,位置が変わっていなくても,その3Dオブジェクトが姿勢を変えれば,レイトレーシング用のシーンデータ構造であるBVHも,その形状に見合ったものに更新しなければならない。だが,これもメモリアクセスがヘビーなので,なるべく避けたい処理系なのだ。
しかし,サボるわけにもいかないので,このデモでは,動くロボット2体に対応するBVH更新をフレームごと行うのではなく,複数フレームに渡って分散して行っているとのことだ。
これを行うと,レイトレーシング法による描画が通常のラスタライズ法による描画に対して若干遅延する。ただ,今回のデモでは,レイトレーシング法で描画する要素は,主要なコンテンツではない鏡像や影なので,そこは許容すると言うことなのだろう。
3つめは,「Variable Rate Shading」(VRS)を活用することだ。
VRSとは,GPUによる描画をフル解像度で行わず,必要に応じて解像度を変更しながら描画する技術になる。たとえばVRコンテンツでは,視線追跡技術と組み合わせて,注視点に近ければ近いほど高解像に描画する「Foveated Rendering」にVRSを有効活用している。
今回のデモでは,シーン内の暗がりに鏡像を描くときに低解像度で行うようにしているとのこと。また,影生成についても,影の輪郭付近はフル解像度で描画するが,そうでない影内のピクセルは低解像度で描画しているそうだ。
なお,画面内のどこをどういう解像度で描画するかの解像度バランス設定は,前フレームの情報を参考にして決める仕組みとなっているとのこと。
これらすべての最適化を適用した場合の性能計測結果が,以下のグラフとなる。
結果は,ハイブリッドな鏡像生成とハイブリッドな影生成を入れて89fps,屈折や環境遮蔽も入れた全要素有効時で53fpsとなっている。
実際のゲームではないので,このフレームレートが優れているのかは判断が難しいが,本セッションで語られたこと自体は,レイトレーシング法をスマートフォン向けGPUで導入するときの参考になりそうである。
描画性能を突き詰めるためには,レイトレーシングパイプラインを使わずに,ラスタライズ法のシェーダプログラムにインラインのレイトレーサを組み込む必要があるというのは,かなり大変そうである。スマートフォン向けゲームの場合,「そこまでしてレイトレーシングを組み込まなくてもいいかな」と考える開発スタジオも多そうだが,そこはそれ。このあたりは,ゲームエンジンが対応してくれるテーマだとは思うので,Unreal EngineやUnityの動向に注目していきたい。
4Gamer「GDC 2024」掲載記事一覧
- 関連タイトル:
Mali,Immortalis
- この記事のURL: