2Dゲームでトーチライト効果(光源の周りの明るい領域)を実現できますか?


16

シンプルな2Dゲームを自分で書くことを考えています。最初は完璧なグラフィックスやゲームプレイでは輝きませんが、PCゲーム開発の最初のステップと考えています。したがって、このような単純なスプライトベースの2Dゲーム(ヒーローズIVやStartcraft BroodWarなど)を想像してください。

照明の変化に応じてゲームプレイが昼夜をサポートし、同時にすべての照明のニュアンスにスプライトを作成しなければならないのは気が狂います。そこで、他のオブジェクトの上に半透明のレイヤーを追加するだけで十分だと判断しました。

このソリューションの問題は、ゲーム内に光源オブジェクト(トーチを着ているヒーローや燃えている建物など)がある場合、その周囲に明るい領域が必要であるということですよね?私は半透明のレイヤーをすべての上に置いているので、私が望むトーチライトの視覚効果を実現するにはどうすればいいですか?照明効果に基づいて「ギャップ」または異なる色の領域を追加して、そのレイヤーを再描画することはできますか?


2
マスクは行く方法かもしれない
グスタボマシエル

5
タイトルの「トーチライト」は、トーチライトという名前のゲームのために混乱を招く可能性があります。
テトラッド

4
@Tetrad大文字でない限り問題ありません。私に関しては、トーチライトはあなたのコメントを読むまで全く思い浮かばなかった。
有名なガーキン

それにもかかわらず、タイトルをより具体的にするための編集を提案しました。
有名なガーキン

回答:


12

プログラミングの対象がわかりませんが、XNAでこれを処理する方法は次のとおりです。

  1. 描画呼び出しで、List<Light>オブジェクトが作成/クリアされます。
  2. タイルの描画ループ中に、各タイルにライトが関連付けられているかどうかが確認されます。存在する場合、Lightオブジェクトはに追加されますList<Light>
  3. タイルは独自に描画されますRenderTarget2D
  4. タイルループの後、Lights のリストは繰り返し処理さRenderTarget2Dれ、次のようなテクスチャを使用して独自に描画されます:(
    光テクスチャ注:ここではR、G、Bの値を使用しましたが、おそらく、実際のテクスチャ。)
  5. カスタムシェーダーを使用して、タイルサーフェスを画面にレンダリングし、各ピクセルで「暗さ」の値をサンプリングするパラメーターとして照明サーフェスを渡します。


ここで、注意すべきことがいくつかあります。

ポイント4について:

実際には、2つのカスタムシェーダーがあります。1つは照明レンダーターゲットにライトを描画し(ステップ4)、もう1つは照明レンダーターゲットを使用してタイルレンダリングターゲットを画面に描画します(ステップ5)。
ポイント4で使用されるシェーダーを使用すると、「明度」値を(私が呼んでいる)追加できます。この値はfloat、テクスチャをレンダーターゲットに追加する前にテクスチャの各ピクセルに対して乗算されるため、本質的にライトを明るくしたり暗くしたりできます。
この時点で、ライトの「スケール」値も考慮します。つまり、1つのテクスチャのみを使用して、大きなまたは小さなライトを作成できます。

ポイント5について:

ライティングレンダーターゲットは、基本的に各ピクセルの値が0(黒)〜1(白)であると考えてください。シェーダーは基本的に、タイルレンダーターゲット内のピクセルのRGB値に対してその値を乗算して、最終的な描画イメージを作成します。

また、ここにいくつかのコードがあり、昼/夜のオーバーレイカラーとして使用する値を(シェーダーに)渡します。これもRGB値に乗算され、ライティングレンダリングターゲットの計算に含まれます。


さて、これは、オブジェクトやその他の物の周りを光が通り抜けないようにすることはできませんが、少なくとも私の目的では、それはシンプルでうまく機能します。

私はここここでより詳細なブログ記事を書きました。現時点では時間がありませんが、必要に応じてgamedevで詳細を確認できます。

ああ、ここで私の地図エディターでそれを見てみましょう:ここに画像の説明を入力してください


すべてのフレームにコストがかかりすぎないように、リストを生成してクリアしますか?
グスタボ

@Gtoknu私のゲームでは目立った違いはありません。このリストは、メモリ内に既に存在するオブジェクトへの参照を保持しているだけなので、すべてのライトが再作成されているわけではなく、1つのリストだけではありません。
リチャードマースケル-ドラッカー

あなたは完全にではなく、正しいかもしれませんが、あなたはそうです。もちろん、完全なオブジェクトを作成しているわけではありませんが、参照にポインターを追加しているので、使用率は低くなりますが、依然として消費されます。あなたは良い方法でやっているが、私はあなたのdrawメソッドの外にリストを置く場合、更新で行うロジックがはるかに高速引き分けに比べているので、それは、より良いかもしれないと思う
グスタボ・マシエル

@Gtoknuもちろん、どこでも好きな場所にリストを宣言できますが、ポイントはライトがタイルに関連付けられていることです。タイルDrawメソッドは、タイルにライトがあるかどうかを調べる場所です。Updateメソッドで描画されたすべてのタイルをループ処理しないので、余分なオーバーヘッドが追加されます。また、XNAはUpdate1秒間に60回呼び出されることを保証しようとするDrawため、この呼び出しを犠牲にする可能性があります。つまり、このコードは実際にはあまり頻繁に呼び出されません。
リチャードマースケル-ドラッカー

とはいえ、最終的には空間分割に基づいてライトを独自のリストに移動し、画面と交差するセクションにすべてのライトを描画したので、これは重要なポイントです。私は時間の不足のために私の投稿でそれについて話しませんでしたが、それは私がリンクした2番目のブログ投稿で言及されました。
リチャードマースケル-ドラッカー

9

通常、2Dゲームの照明は、すべてのスプライトの法線マップを作成してから、2Dスプライトの3D照明効果を計算します。これは大まかに「2.5D」として知られています。しかし、私はしませ、最初のゲームでは複雑なため、これを行うことはお勧めし。

XNAでこれを行った人の素晴らしいビデオを次に示します。http//www.youtube.com/watch? v = -Q6ISVaM5Ww

そうは言っても、おそらく、さまざまな前提で機能する擬似照明システムをごまかして取得する方法があります。


すでにこのビデオを見たことがありますが、このような素晴らしいテクニックに言及した+1
グスタボマシエル

アドバイスとビデオリンクをありがとう。実際、地図は解決策のようです。私自身は、最上層のマップを使用して「ギャップ」を作成したり、下層のオブジェクトに対する効果を変更しようとします。
イヴァイロスラヴォフ

5

達成しようとしている効果について完全に具体的でない場合、アプローチを提案することは困難です。ライトが環境によって遮られるかどうか、ゲームの視点、ライトが環境とどの程度相互作用するかなどの詳細。

私は2セントを落とします。Catalin ZimaによるDynamic 2D Shadowsというタイトルのこのチュートリアルがあなたの法案に合っているかどうかを確認してください。ご覧のとおり、ライトには半径があり、障害物を通過しません。半径と色を少しアニメーション化して、実際のトーチライトに近づけることができます。

ここに画像の説明を入力してください

この場合、ライトはシーンの上部の一種のオーバーレイとして機能しますが、障害物を考慮していますが、ジョンの例と同じ程度には相互作用しません。

編集

カタリンは参照として使用した別の記事にリンクしていますが、リンクは壊れています。これが更新されたリンクです。


おかげで、これは私が
望んで
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.