Unity を検索

モバイルゲーム開発のためのライティングのヒント

2020年6月15日 カテゴリ: ゲーム | 5 分 で読めます
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

ライティングはゲームのビジュアル要素の中で最も重要なものの 1 つです。Arm のパートナーが、モバイルゲームのライティングを最適化するために役立つヒントを紹介してくれました。

モバイルゲームのレンダリングでは、ライティングはパフォーマンスを考慮する上で最も重要な要素の 1 つです。また、視覚的なスタイルを完成させる上で最も重要な要素の 1 つでもあります。しかし、アート面で実現したい目標とパフォーマンスの折り合いがつかないということがしばしば起こります。

幸いなことに、そのギャップを越えてモバイルハードウェアの制約の中で目標を達成する方法があります。この記事では、モバイル向けチップの設計に関する世界最大の企業である Arm のパートナーが、そのベストプラクティスガイドからライティングに関するヒントをいくつか紹介します。

レンダリングパイプライン

Unity の組み込みレンダーパイプラインでは、フォワードレンダリングとディファードシェーディングの 2 つのうちどちらかのレンダリングパスを選択することができます。フォワードレンダリングでは、リアルタイムのライトは非常に高価ですが、このコストを抑えるために、ピクセルごとに何個ライトをレンダリングするかを選択できます。ディファードシェーディングは GPU サポートを必要としますが、これが利用可能なハードウェア上では多数のリアルタイムライトをレンダリングすることができ、高いレベルでライティングの忠実度を提供します。

ディファードシェーディングは PC やコンソール向けの、ライトを多用するゲームには非常に魅力的ですが、モバイル向けの GPU ではあまり高いパフォーマンスが出ません。これは、マスマーケットデバイスの帯域幅が低いことが原因です。モバイル向けのタイトルの制作においては、できるだけ多くのデバイスでスムーズに動作することが重要です。モバイル向けでライティングについて考慮が必要なプロジェクトを最適化するには、Unity のユニバーサルレンダーパイプラインを使用することをお勧めします。

Unity のユニバーサルレンダーパイプラインは、構築済みスクリプタブルレンダーパイプラインの 1 つで、パフォーマンスを重視したチューニングがされています。ユニバーサルレンダーパイプラインはデフォルトではフォワードレンダリングで動作するようになっており、アプリのパフォーマンスを最大限に高めるための機能を多数備えています(詳しくはこちらをご覧ください)。

ライティングをベイクする

プラットフォームに関係なく、レンダリングの最大のパフォーマンスアップグレードの 1 つは、ライトマップやライトプローブにライティングをベイクすることです。リアルタイムライトを使用する場合、直接光のライティングやシャドウなどの機能は、レンダリングされるフレームごとに個別に計算する必要があります。画面上のライトの数にもよりますが、これには高い計算コストがかかります。パフォーマンス予算によって、画面に表示できるコンテンツの量が大幅に制限されます。「ライトマップベイキング」と呼ばれるプロセスを実行し、計算の多くをオフラインで事前計算することで、これらの制限を回避することができます。

ライトマップベイキングでは、ライティングとシャドウの情報をテクスチャ、つまり「ライトマップ」に保存します。この手法を使って跳ね返った光やソフトシャドウなど、計算量の高いライティング特性をキャプチャすることができ、リアリティを高めることができます。しかし、ライトマップには、理解しておくべきいくつかの制限があります。完全にベイクされたライティングは、シーンの動的な要素に対応して更新することができません。そのため、動的なオブジェクトはライトマップに追加されません。しかし、心配する必要はありません。動的なオブジェクトに対応した、事前計算を行うタイプのソリューションとして「ライトプローブ」を使えばよいからです。

ライトプローブは、オフラインで計算できるライティングデータを保存するという点で、ライトマップと同じ利点を多く持っています。計算コストの多くは、実行時ではなく編集時に発生します。ライトマップが、シーン内の表面の特定のテクセルで受けたライティングをコード化するのに対し、ライトプローブは、シーン内の空のスペースを通過する光を保存します。このデータは、移動する(動的な)オブジェクトを照らすために使用され、シーン全体を通じてライトマップを施されたオブジェクトとの視覚的な一体感を出す上で役立ちます。

テクセル

テクスチャの要素であるテクセルは、テクスチャマップ内の個々のピクセルのことを指します。したがって、テクセルはライトマップを構成する要素でもあり、そしてライティング情報をコード化する際の単位となります。テクセルの制御は、ライティングの品質、ベイクの計算時間、ディスクストレージのコスト、ライトマップのビデオ RAM(VRAM)のコストに影響を与えます。

ライトのベイクを設定する際には、ライトマップの解像度を定義し、単位あたりのテクセル数を指定する必要があります。この場合の単位とは、Unity のデフォルトの単位(多くの場合、1 メートル)での面積の定義です。Lightmap Resolution プロパティは、Unity の Lighting ウィンドウで確認できます。シーンでテクセルがどのようにレイアウトされているかを表示するには、シーンビューの上部の最も左側にある、シーンビューの描画モードを設定するドロップダウンメニューをクリックして「Show Lightmap Resolution」にチェックを入れるか、同じメニューの「Lightmap Indices」をクリックします。

これで、ベイク済みのオブジェクトが市松模様のオーバーレイで覆われるようになりました。これが、ライトをベイクしたときのテクセルの分布です。下の図は、同じキューブに 2 つの異なる設定を適用した例です。左のキューブの設定は 5 で、右のキューブの設定は 2.5 です。この数が高いほど、計算量が多くなります。解像度が低いほど、必要なライトマップスペースが少なくなり、必要なライトマップも少なくなります。しかし、解像度が低いほど、品質も低くなることを覚えておいてください。実験を重ねて、自分のプロジェクトに最適なものを見つけましょう。

ベイクできないならフェイクする

ほとんどの要素をオフラインでベイクしても、キャラクターの影のようなリアルタイムなエフェクトをゲームに入れたいと思う場面があるかもしれません。リアルタイムのシャドウは通常「シャドウマップ」として知られている技術を使って生成されます。シャドウマップにレンダリングされるシーンジオメトリのコストは、それに描画される頂点の数に比例します。そのため、シャドウをキャストするジオメトリとリアルタイムにシャドウをキャストするライトの数を絞ることが重要です。

リアルタイムなエフェクトを実現するには、キャラクターの下に小さな 3D メッシュを配置し、ぼやけたテクスチャを適用するという手法も使えます。これはシンプルで効果的な方法ですが、本物のシャドウマッピングのように高額なコストをかけずにシャドウを得ることができます。

--

ライティングを設定してベイクしたい、プロジェクトの最適化に役立てたい、単にゲームのライティングに興味があるだけ ー この記事の読者の関心はさまざまかと思いますが、皆さんがお持ちのスキルはいずれもゲームを素晴らしいものにするために役立てることができます。ゲームは、学際的な専門知識のユニークなショーケースだからです。ライティングについて学んだことをチームに伝えてください。きっとチームメンバーの役に立つはずです。

2020年6月15日 カテゴリ: ゲーム | 5 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック