こんにちは、habravchamに!

ずっと前に、私はHabrに手紙を書きませんでした:勉強、セッションが来ています、あなたは理解しています。 今日は、リーチプロファイルと
シェーダーモデル2.0を使用しながら、3つの光源への
通常のマッピングを使用して、XNAで
遅延照明 (遅延照明)を実装する方法を説明し
ます 。
シェーダーのトピックについて説明する前に、ここで思い出させてください。 残りは、カット、ビデオ、デモの下にあります。
このパートでは:
- 遅延照明とは
- 法線マッピングとは何ですか?
- 実装、シェーダーの接続
- ピクセルシェーダーの実装
理論
なぜちょうど3つの光源が同時にあるのですか? シェーダーには制限があります。
シェーダーモデル2.0では 、1つのシェーダーパスに64を超える算術演算を含めることはできません。 1パスで3つ以上の光源を使用するには、
シェーダーモデル3.0が必要です
。512個の算術演算をサポートします。パスごとに約30光源です。 ただし、モデル3.0の場合、
hidefプロファイルが必要であり、
DirectX10に適したグラフィックカードが必要です。 したがって、3つのソースに制限します(さらに、複数のパスでソースを描画できないのはなぜですか?したがって、3つのソースはシェーダーのみの制限です。この記事では1つのパスのみを考慮します)。
ところで、シェーダーモデルの比較:
詳細は
こちらをご覧ください 。
2番目のモデルのピクセルシェーダーの制限は整理されているようです。
ここで、もう1つの奇妙な言葉を見てみましょう。「
遅延照明 (
遅延照明 )」です。
据え置き照明
遅延ライティングと標準のライティングメソッドからのシェーディングの主な違いは、これらのメソッドがシェーダーの結果を直ちにカラーフレームバッファーに書き込むことです。
説明が非常に簡単な場合は、光源からのすべてのピクセルをカウントし、すぐにフレームバッファーに書き込みます。この場合、フレームバッファーに4つの合計があります(周囲+ 3つのソースの結果)
非常に簡単に言えば、我々が見つけた遅延照明とは何か、どのような法線マッピングがどのようなものであるかを理解することです。
法線マッピング
普通の人々には、テクスチャ法線のマップも知られています。これは、まだ法線は表面に垂直であると考える人向けです。
あなたがそれで勝つことができるものを見てみましょう。 通常のマップを使用した場合と使用しない場合の照明の例を示します。 次に、その仕組みを説明します。
これは、照明を使用しない場合のシーンの外観です。
これは、ライティングを使用して(法線マッピングを使用せずに)シーンを表示する方法です。
これは、ライティングを使用したシーンの外観です(法線マッピングを使用):
ご覧のとおり、結果は顔にあります。
法線マッピングを使用したシーンは「ボリューム感」があり、特にダイナミクス(光源の動き)でよりリアルに見えます。
テクスチャ自体を見てみましょう。
テクスチャ自体(
カラーマップ ):
法線テクスチャ(
法線マップ ):
2番目のテクスチャでは、何がすぐにわかるのではなく、ディスプレイスメントシェーダー
に関する記事を覚えていますか? そこで、ピクセルを曲げる方法に関する情報をR、Gチャネルを通じて送信しました。ここでは、R、G、Bを使用して法線に関する情報を送信します。 R = X、G = Y、B =Z。そしてすでにシェーダーで、ライティングの計算でX、Y、Z座標を操作します、簡単ですか?
読者が再び何も理解しなかった場合、彼が初めて「普通」という言葉を見て説明を受け取った後でも、法線マップを使用して、テクスチャは照明用の3D表現を取得します。
そして、はい、法線マップの作成については、それら
を描画することは事実上
不可能です 。それらはハイポリゴンモデルから削除されるか、テクスチャ自体から生成されます(たとえば、Photoshop
プラグインを使用)。
少し理論を理解しました。これをすべてコードで実装してみましょう。
練習する
ここで、すでにコメント付きのコードを提供します。
光源ビュー、
LightEmmiterクラスを作成します。
public class LightEmmiter {
ここで、
Game1 (メインクラス)を使用します。
変数を作成します。
Texture2D texture;
これは、
LoadContentメソッドですべて初期化され
ます 。
texture = Content.Load<Texture2D>("test1");
Draw自体を更新します。
残っている最も重要なことはすべて、
deferred.fxシェーダーを作成して、次のリストを作成することです。
この記事ではそれだけです-複数のシェーダーパスを介して無限の数の光源を実装する方法については説明しません。これは自分で行うことができます;)
照明デモンストレーションビデオ:
デモ(exe)へのリンク:
こちら 。
ソースへのリンク(プロジェクト、VS2010):
こちらまた、材料を分析し、きれいな処女の道を指すのを助けるために、
lazychaserに特別な感謝を表明したいと思います。
頑張ってください;)