プログラミングの対象がわかりませんが、XNAでこれを処理する方法は次のとおりです。
- 描画呼び出しで、
List<Light>
オブジェクトが作成/クリアされます。
- タイルの描画ループ中に、各タイルにライトが関連付けられているかどうかが確認されます。存在する場合、
Light
オブジェクトはに追加されますList<Light>
。
- タイルは独自に描画されます
RenderTarget2D
。
- タイルループの後、
Light
s のリストは繰り返し処理さRenderTarget2D
れ、次のようなテクスチャを使用して独自に描画されます:(
注:ここではR、G、Bの値を使用しましたが、おそらく、実際のテクスチャ。)
- カスタムシェーダーを使用して、タイルサーフェスを画面にレンダリングし、各ピクセルで「暗さ」の値をサンプリングするパラメーターとして照明サーフェスを渡します。
ここで、注意すべきことがいくつかあります。
ポイント4について:
実際には、2つのカスタムシェーダーがあります。1つは照明レンダーターゲットにライトを描画し(ステップ4)、もう1つは照明レンダーターゲットを使用してタイルレンダリングターゲットを画面に描画します(ステップ5)。
ポイント4で使用されるシェーダーを使用すると、「明度」値を(私が呼んでいる)追加できます。この値はfloat
、テクスチャをレンダーターゲットに追加する前にテクスチャの各ピクセルに対して乗算されるため、本質的にライトを明るくしたり暗くしたりできます。
この時点で、ライトの「スケール」値も考慮します。つまり、1つのテクスチャのみを使用して、大きなまたは小さなライトを作成できます。
ポイント5について:
ライティングレンダーターゲットは、基本的に各ピクセルの値が0(黒)〜1(白)であると考えてください。シェーダーは基本的に、タイルレンダーターゲット内のピクセルのRGB値に対してその値を乗算して、最終的な描画イメージを作成します。
また、ここにいくつかのコードがあり、昼/夜のオーバーレイカラーとして使用する値を(シェーダーに)渡します。これもRGB値に乗算され、ライティングレンダリングターゲットの計算に含まれます。
さて、これは、オブジェクトやその他の物の周りを光が通り抜けないようにすることはできませんが、少なくとも私の目的では、それはシンプルでうまく機能します。
私はこことここでより詳細なブログ記事を書きました。現時点では時間がありませんが、必要に応じてgamedevで詳細を確認できます。
ああ、ここで私の地図エディターでそれを見てみましょう: