2Dゲーム用の高性能照明システム





こんにちは、私の名前はAlexander Birkeです。最近、 最初のSteamゲームである Laser Disco Defendersをリリースしました。 ゲームに含まれている技術的および設計的なソリューションのいくつかを明らかにすることは興味深いと思われます。 まず、自分の照明システムから始めます。これにより、弱いコンピューターでも、多くの2次元光源を操作できます。 LDDはUnityで作成されましたが、このアプローチはメッシュを作成できる他のゲームエンジンでも機能します。



4 MBてんかんgif










照明システムを正確に所有しているのはなぜですか?



LDDの基本的な仕組みは、撃たれたすべてのレーザービームが壁から跳ね返り続け、プレーヤーに当たる可能性があるため、「do-it-your bullet 」と呼ばれます 。 視覚的なスタイルは、ディスコ時代と当時の活気に満ちたダンスフロアに触発されたので、レーザーで周囲を照らしたかったのです。 照明は、レーザービームが間もなくフレームに入ることをプレイヤーが理解するのに役立つため、便利です。 このゲームはPlayStation Vitaでもリリースされたため、シーンに描画される各光源に描画呼び出しを使用する標準のUnity遅延照明と比較して、より生産的なソリューションが必要でした。 画面上で同時に最大30のレーザービームを簡単に作成できるため、ポータブルコンソールはこのような負荷に対処できません。 また、照明がレーザービームの形状に一致するようにしたかったのです。 レーザービームは通常長くて細いため、標準のUnity光源(方向、ポイント、スポットライト)はどれも適切ではありませんでした。





左側の点光源は、レーザービームの形状と一致しません。 右側には、希望するライトの輪郭があります。



他のゲーム要素も光を放射する必要があったため、照明システムがレンダリングすることになっているゲームオブジェクトに配置する単純な照明コンポーネントが必要でした。





レーザーショットだけでなく、他の光源もサポートする必要があります。



手続き型グリッドが助けになります!



手続き型グリッドを使用する主なアイデアは、照明データを照明バッファーに「入力」し、それをシェーダーでサンプリングすることでした。 これは、遅延照明の原理と違いはありませんが、私のソリューションは2Dの作業のみを必要とするため、手続き型グリッドを使用して照明をレンダリングすることにより、1回のレンダリングですべての照明を計算できます。



ゲーム内のレーザーは手続き型グリッドとしてレンダリングされるため、光の強度の低下を保存するために使用できるテクスチャが既にありました。 私はそれを(pam-pam-pa-a-am!)...レーザーテーブルと呼びました!





レーザーテーブル。 上から下へ:グロー、光線の端、光線自体。 マークされた領域には、すべてのレーザー光源の拡散散乱があります。



レーザーの視覚タイプを選択するには、ビームの長い部分、その端、および壁に当たったときに発生するグローが必要でした。 さらに、このグローは、ビームの各セグメントが単一の四角形ストリップとしてレンダリングされるという事実を隠す必要があるため、それらは非常にうまく重なりません。 これはちょっとしたトリックですが、視覚的にはすべてが良く見えます。





個々のビームのグリッド生成スキーム。 セグメントごとに、ビームの端の2つの四角形(クワッド)と、中央の直線セグメント用にもう1つが必要です。 壁の輝きからの光もその四角が必要です。 同じトポロジを使用して、レーザー自体をレンダリングします。



各レーザーの照明を作成するには、各セグメントの位置を取得し、レーザーからの光の距離に応じて頂点を外側に押します。 次に、頂点が作成され、他の光源のグリッドに追加されます。 LDDでは、ラウンドソースのみが必要でしたが、他の形式を簡単に追加できます。 これらの丸い光源は、レーザーテーブルからの同じ拡散グローを使用し、四角形のようにレンダリングします。









目に見える隠された照明グリッド。 通常、ライティンググリッドはゲーム内の他のすべてよりはるかに下にあるため、シーンをレンダリングするときにシーンは表示されません。 ここでは、光を放つレーザーと障害物のスポットを見ることができます。



次に、グリッドは別のカラーバッファーにレンダリングされます。 Unityでは、メインカメラと同じレイアウトとサイズのカメラを使用しました。 次に、レイヤーを使用してRenderTextureでレンダリングし、ライティンググリッド以外をすべて除外します。









照明グリッドとそれがレンダリングされるテクスチャ。



その後、カラーバッファーは通常のテクスチャとしてGPUに送信されるため、どのシェーダーからでも使用できます。 独自のシェーダーは、スプライト、パーティクル、および照明を必要とするその他すべてのために作成されました。 頂点シェーダーでは、各頂点がそのビューポートの位置を決定するため、フラグメントシェーダーで照明テクスチャをサンプリングするときにUV座標として使用できます。 最も興味深いのは、ゲームの背景です。 特定のテクセルの反射率を決定するために、アルファチャネルを使用します。 これは、ゲームに深みを追加するのに大いに役立ちます。





Laser Disco Defendersの背景テクスチャの例。 カラーチャンネルは左側に表示され、反射に使用されるアルファチャンネルは、その洞窟のテクスチャに暗い亀裂を作成し、右側に表示されます。 スペースクジラの骨格はまだあります... できるからといって



最適化



システムには、最適化のコツがいくつかあります。 主なものは、各光源の頂点を作成する前に、各光源の可視性のピラミッドに沿った切り捨てです。 これにより、プロセッサで必要な計算量が削減され、GPUに送信される頂点の数が制限されます。 照明グリッドとテクスチャの画像からわかるように、照明バッファの解像度はゲームよりもはるかに低くなっています。 アーティファクトなしでゲームの解像度から10倍削減できることがわかりました。 テクスチャを読み取るとき、シェーダーでのバイリニアサンプリングは、ゲームに十分な補間を提供します。 これにより、照明システムで使用される塗りつぶし作業の量が削減され、その上にいくつかの視覚効果を作成するのに十分なレンダリングリソースが残ります。



結論とさらなる研究



Vitaコンソールでは、このゲームはFPSをかなりの量提供します。これは、ゲームの視覚的な明瞭さを考えると、非常に誇りに思っています。 PC向けゲームのレビューでは、良好なレベルのパフォーマンスが確認されました。 また、照明がゲームのサイケデリックなディスコスタイルを大幅に強化することにも同意していただければ幸いです。

これまでのところ、システムはシャドウを作成できないという事実によって制限されています。 追加できますが、パフォーマンスが犠牲になります。 影を作ることに決めた場合、低解像度のライティングバッファーでは焦点を絞ることができないでしょう。 それでも、システムは照明の反射を提供できません。 方向を表すカラーチャネルを使用する別のレーザーテーブルを使用して作成できます。その後、別の方向バッファーに「インプリント」されますが、このようなシステムは、Laser Disco Defenderに必要なものよりも複雑です。



記事をお楽しみください。 次の投稿では、レベルの手続き型生成について詳しく見ていきますので、ご期待ください!



アレクサンダーは、ブリストルのゲームスタジオOut Of Bounds Gamesを運営しています。 彼のTwitterアカウント、または世界で最も企業のURLを持つ会社のFacebookページを購読できます。 彼はまた、ブリストルユニティのMeetupを主催しています。










All Articles