2

平面で法線マッピングを行おうとしていますが、目立った結果が得られません:(

私のシェーダー

http://pastebin.com/raEvBY92

私の目には、シェーダーは正常に見えますが、目的の結果が得られません(https://dl.dropbox.com/u/47585151/sss/final.png)。すべての値が渡されます。グリッドを作成すると、法線、法線、従法線が正しく計算されます。これを確認しました。これは、アンビエント、拡散、スペキュラー、バンプマップの画面です。

https://dl.dropbox.com/u/47585151/sss/ambient.png

https://dl.dropbox.com/u/47585151/sss/bumpMap.png

https://dl.dropbox.com/u/47585151/sss/diffuse.png

https://dl.dropbox.com/u/47585151/sss/specular.pngbump=normalize(mul(bump, input.WorldToTangentSpace))それらは合法的なようです...(間違いなく正しいように見えますが、終わりに影響を与えない )の結果であるバンプマップ結果。異なるスペースのアイデアがわからないか、マトリックスの乗算の順序を変更した可能性があります。ワールドマトリックスによって、グリッドの位置と方向を理解します。これは変更されず、単位行列です。ビューマトリックスのみが変更され、カメラを表します。自分の空間での位置と向き。

私の間違いはどこにありますか?

4

1 に答える 1

1

まず第一に、問題がある場合は、これに属さないすべてをコメントアウトすることをお勧めします。アンビエント、スペキュラー、さらにはディフューズ テクスチャーを使用したライト計算全体は、現時点では興味深いものではありません。と

output.color=float4(diffuse ,1);

コード内の何かを変更すると、問題に集中して何が変わるかを明確に確認できます。

クワッドが z=0 の xy 平面にある場合、ライトベクターを変更する必要があります。通常、テスト目的で対角ベクトル (normalize(1,-1,1) など) を使用して、オブジェクトとの平行方向を防ぎます。

あなたのコードを見てみると、あなたが考えていたように、さまざまな空間のアイデアが得られなかったようです;)法線マッピングの基本的な考え方は、追加の法線を使用して表面に関する追加情報を提供することです。それらは法線マップに保存されるため、rgb にエンコードされます。ここで、b は通常アップベクターです。これらはワールド空間ではなく、接線空間 (接線空間 = 三角形の表面空間) にあるため、これらを 3D ワールドに適合させる必要があります。この変換はより複雑であるため、通常の計算は逆になります。法線、従法線、接線をマトリックスとして変換し、ライトベクターとビューベクターをワールド空間から接線空間に変換します (ワールド空間の軸 xyz を tnb にマッピングします - 接線、法線、従法線、順序が間違っている可能性があります。通常はそれらを入れ替えます)それが機能するまで;))。あなたのラインで

bump = normalize(mul(bump, input.WorldToTangentSpace));

接空間の法線を接空間に変換しようとします。これを変更して、頂点シェーダーのビューとライトベクターを接線空間に変換し、変換されたベクトルをピクセルシェーダーに渡します。そこで接線空間でライト計算を行うことができます。法線マッピングの追加のチュートリアルを読むと、これが機能するようになります! :)

PS: 基本的なライティングが完了したら、鏡面反射光の計算にもエラーがあるようです。

float3 reflect = normalize(2*diffuse*bump-LightDirection);

この行は中間ベクトルを計算する必要があるようですが、したがってビューベクトルが必要であり、拡散のような照明強度を使用しないでください。しかし、チュートリアルはこれを私よりも詳細に説明できます。

于 2012-11-01T10:38:00.240 に答える