私は自分の照明をTerrariaのブロック照明に似せようとしています。これで、ブロックを暗くする方法がわかりました。特定の光レベルにブロックを割り当てることができますが、丸い形で発光する実際の光のエンティティを作成するにはどうすればよいですか(ひし形にすることもできます)。ご不明な点がございましたら、お気軽にお問い合わせください。
2 に答える
基本的な 2D ライティングは非常にシンプルです。ブロックからライトまでの距離チェックを行い、その値を使用してライトをスケーリングします。Spritebatch.Draw には優れた Color tint パラメータ[リンク]があるため、これはかなり簡単に実行できます。
疑似関数は
distance = (block.position - light.position). Length();
lightPower = distance / light.MaxDistance;
finalTint = light.Color * lightPower;
Render Block, with finalTint
見栄えの良い光を得るには、「距離 / 光.MaxDistance」をより滑らかな効果に置き換えることができます。Terraria のようにいくつかのブロックを通過するライトも必要な場合は、ブロックと光源の間のすべてのブロックを数えることができます。その量だけ lightPower をスケールダウンすると、Terraria と同じ効果が得られます。
もちろん、これは最適化されていない方法ですが、うまくいくはずです。
ただし、最新の Terraria バージョンでは、ブロックごとではなく、ピクセルごとのライティングがスムーズになっているようです[プレビュー]。そのために、高速なパフォーマンスを維持するために、2 番目のレンダー ターゲットやピクセル シェーダーを使用したと思います。ただし、パイプラインのレンダリングに慣れていない場合、これは少し難しいかもしれません。
お役に立てれば!
私は同様の照明モデルを使用してゲームに取り組んでおり、その方法は次のとおりです。
- ライティングなしでシーンをレンダー ターゲット (「シーン バッファー」と呼ばれる) に描画します。
- 必要な形状のグレースケール グラデーションとして表されるシーンのライトを、2 番目のレンダー ターゲット (「ライト マップ」と呼ばれる) に描画します。
- シーン バッファーを画面に描画し、ライト マップをパラメーターとしてピクセル シェーダーに渡します。
- ピクセル シェーダーで、各ピクセルのライト マップの値を照会し、必要に応じて最終ピクセルの色を上下に調整します。
これにより、色付きの照明を使用することもできます。必要なのは、ライト マップにレンダリングするライト グラデーションに色を付けるだけです。加算アルファブレンディングを使用することを忘れないでください。
このアプローチの欠点は、かなり素朴で、ライトを遮る (つまり、ライトが壁を通過する) 簡単な方法がないことです。私たちの場合、これは問題ではありません。あなたは別の方法で決定するかもしれません。