法線と法線マップ


17

Assimp Asset Importer(http://assimp.sourceforge.net/lib_html/index.html)を使用して3Dモデルを解析しています。

これまでのところ、メッシュの各頂点に定義されている法線ベクトルを単純に引き出しました。それでも、法線マップに関するさまざまなチュートリアルを見つけました...

法線マップについて理解しているように、法線ベクトルは法線マップの各テクセルに格納されており、これらをシェーダーの法線テクスチャから引き出します。

法線を取得するのに2つの方法があるのはなぜですか?

回答:


31

短い答え

法線マップと法線は2つの異なるものです。法線はメッシュ/サーフェスの幾何学的なプロパティであり、シェーディングとライティングの計算専用ではありませんが、実際には物理学など他の多くの用途があります。法線マップは、バンプをシミュレートするためにコンピューターグラフィックスで使用される代替法線ベクトルをエンコードするテクスチャです。

ロングアンサー

法線形状の法線ベクトルまたは(通常の頂点、例えば面法線)指定されたオブジェクトに垂直な線です。グラフィックスの法線は、通常、光の方向と表面の法線との内積をとることにより、表面全体の拡散反射を計算するなど、光の計算に使用されます。通常、法線はメッシュの幾何学的特性(面/頂点)に基づいて計算され、同じ平面にある2つの非平行エッジの外積を取ります。

OpenGLでは、頂点ごとに指定されているため、頂点ごとに法線が指定されます(そのため、頂点属性と呼ばれます)。法線はOpenGLによって面(三角形)の各頂点にわたって補間できるため、頂点ごとではなくピクセルごとに反射光を計算できるため、より正確な結果が得られます。

法線マッピング:一方、コンピュータグラフィックスでは、テクスチャマップの法線をエンコードする手法であるため、各法線はテクセルごとにエンコードされます。通常、バンプとへこみの照明を偽造するために使用されます(バンプマッピング、視差マッピングなど)。

法線はメッシュ/サーフェスの幾何学的プロパティに基づいて計算されるため、法線マップは、ポリゴンを追加せずにバンプをシミュレートしてサーフェスに詳細を追加できる代替法線を提供します。

通常、法線マップは、より詳細な3Dモデルを使用して生成され、このモデルに基づいて法線を計算し、法線マップにエンコードします。

なぜ両方が必要なのですか?

レンダリングについてのみ言えば、法線と法線マップは通常、最終的な照明効果を達成するために一緒に使用されます。良い例はバンプシェーダーです。接線空間と呼ばれるものを計算する幾何学的法線。通常、接線空間は法線マップの再利用性を提供するために使用されます。

法線はサーフェスの幾何学的属性と見なされ、光の計算だけでなく多くの用途があることに注意してください。一方、法線マップは通常、表面的​​な効果に使用されます。

答えを拡張して、接線空間が重要である理由を説明します。

簡単な答え: 正接空間は、基になるジオメトリに依存しない法線マップを作成するために使用されます。

[編集]接線空間の法線マップとワールド空間の法線マップを表す画像を追加しました。

ここに画像の説明を入力してください

長い答え: 下の図は、UV平面と接線空間を定義する法線を示しています。法線マップを生成するとき、使用される空間は常にZ方向を向く法線を持っていることがわかります(法線マップが青みがかる理由です) 、これは表面の曲率**を無視するのに役立ちます。

接線空間には、法線マップのエンコードが特定のメッシュ法線にバインドされていないという利点があります。法線マップをワールド空間またはオブジェクト空間でエンコードすると、エンコードする各法線はワールド空間で元のメッシュ法線がどのように変化するかに基づいた方向を持ち、法線マップがモデル変換の影響を受けることは言うまでもありません。

ここに画像の説明を入力してください

上記の2つの図では、接線空間が法線マップを作成していることは非常に明確です(右)。すべての法線はバンプの効果をシミュレートするために小さな変化でほぼ同じ方向にエンコードされているため、下にあるジオメトリとは無関係です。

**表面の曲率は、幾何学的なオブジェクトが平坦であるか、線の場合は真っ直ぐであるかによって逸脱する量によって定義されますが、これはコンテキストに応じて異なる方法で定義されます。

接線空間表現


1
頂点ごとに定義された法線フィールドと接線フィールドがないと、通常のテクスチャだけを一貫して使用できないことを示す画像を見つけることができれば、ほとんどの初心者のグラフィックプログラマーにとって、この不可解な問題に対する最善の答えになります!
テオドロン

いい答えですが、法線はOpenGLによって各面にわたって補間されません。自分でそれを行い、補間された法線をOpenGL(またはシェーダーコード)に提供する必要があります。
アナスタシオスG

1
@AnastasiosG彼は、特定のプリミティブに対してフラグメントが計算されるたびに、三角形を越えて補間されるさまざまなデータのデフォルトの動作について話していると思います。三角形の3つの頂点法線のうち、特定の法線を1つ使用するようにOpenGLに指示するために使用できるフラグがありましたが、これはデフォルトの動作ではありません。
テオドロン

1
@AnastasiosGこのような詳細はOpenGLの使用方法に関するものではないので、このような詳細は答えにならないと思いました。しかし、それが役立つ場合、固定パイプライン時代に、openGLに補間を指示するためにglShadeModel(GL_SMOOTH)が必要でした。プログラマブルパイプライン時代では、シェーダーで変数を可変またはイン/アウトとして定義し、OpenGLが補間できるようにします。
concept3d

バンプマップは、白黒のテクスチャに基づいて上下する単純な(幾何学的な)法線であることを付け加えます。:)
エンタルピ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.