私は、作成する予定の戦略ゲーム用のアイソメトリックMinecraft風のゲームエンジンに取り組んでいます。ご覧のとおり、実際には照明が必要です。すべてが同じ色合いであるため、別々の標高を区別することは困難です。だから私の質問は:スプライトの特定のセクションだけをシェーディングできますか?これらのブロックはすべて単なるスプライトであるため、画像全体をシェーディングすると、ブロック全体がシェーディングされます。
1 に答える
まあ、それはあなたがあなたの照明をどのように行うかによって異なります。
基本的に、スプライトは 2 つの三角形からなるテクスチャ付きの四角形です。
従来の頂点ベースのライティング (組み込み関数でサポートされていますが、現在は廃止されています) は、そのクワッドの 4 つのコーナーのライティングを計算するだけで、それ以外はすべて補間されます。これは非常に高速ですが、特にスポット ライトと大きなクワッドの場合、不適切なライティングが発生する可能性があります。
ディレクショナル ライティングのみを使用する場合は、法線マップをクワッドに適用して、テクセルごとにライティングに影響を与えることができますが、それでも、それは希望どおりではない可能性があります。
最新の方法は、シェーダーを使用することです。つまり、照明はピクセルごとに評価されます。次に、フラグメント/ピクセル シェーダーで使用されるクワッドのテクセルごとのライティング情報を提供する必要があります。
明確にするために、このコンテキストでのいくつかの用語の意味は次のとおりです。
- per-texel : テクスチャ内のピクセルごとに、これらの値が補間される場合があります
- per-pixel : 出力ピクセルごと、つまり画面ピクセルごと
編集:
スクリーンショットを見たところ、隣接するスプライトが同じレベルにない場合は、スプライトのエッジの色合いを変更する必要があるようです。どのスプライト エッジを表示する必要があるか (つまり、そのエッジでレベルが変化するか) が既にわかっていると仮定すると、そのエッジを形成する頂点のシェーディングを変更するだけで済みます。
照明を使用しない場合は、頂点の色を白に設定し、シェーディングが必要な頂点の色を少し暗くするだけでよいでしょう。次に、テクスチャの色を頂点の色で乗算すると、エッジが暗くなります。
あるいは、これらのレベルの深度が異なる場合 (つまり、z 値が異なる場合)、エッジ検出にシェーダーを使用できます (SSAO の実装など)。
編集2:
従来の頂点照明を使用している場合は、加重法線を適用すると役立つ場合があります。基本的に、頂点を共有する三角形の法線から加重頂点法線を計算します。
これを行う方法はいくつかありますが、その 1 つは、その頂点の角度に基づいて面に重みを付けることです。法線にこれらの角度を掛けて加算し、最終的に結果の法線を正規化することができます。
その計算の結果は次のようになります (アスキー アート):
| | /
|_______|________/
| / | |
|/______|_______|
上向きの線は法線で、下の線は側面図のスプライトになります。