私の質問への回答は、DOT3 ライティングが OpenGL ES レンダリングに役立つことを示唆していますが、DOT3 ライティングとは何かについて適切な定義を見つけるのに苦労しています。
編集 1
iPhone関連の情報をお待ちしております。
私の質問への回答は、DOT3 ライティングが OpenGL ES レンダリングに役立つことを示唆していますが、DOT3 ライティングとは何かについて適切な定義を見つけるのに苦労しています。
編集 1
iPhone関連の情報をお待ちしております。
DOT3 ライティングは、多くの場合、ピクセルごとのライティングと呼ばれます。頂点照明では、照明はすべての頂点で計算され、結果の照明は三角形に補間されます。ピクセルごとの照明では、その名前が示すように、オブジェクトはすべてのピクセルで照明を計算することです。
iPhone のように固定機能ハードウェアでこれを行う方法は、いわゆるレジスタ コンバイナーを使用します。DOT3 という名前は、次のレンダリング ステートに由来します。
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
これを設定する方法の詳細については、Wolfgang Engels ブログのこのブログ エントリを参照してください。
ピクセルごとの照明を行う場合、いわゆる法線マップも利用することが一般的です。これは、オブジェクト上のすべてのポイントの法線が、特別なテクスチャ マップである法線マップに格納されることを意味します。これは、ID ソフトウェアによってゲーム DOOM 3 で普及しました。かなり低ポリゴンのモデルが使用されていましたが、高解像度の法線マップが使用されていました。この手法を使用する理由は、目は形の変化よりも照明の変化に敏感だからです。
他の質問で、これが発生した理由は、頂点データのメモリ フットプリントを削減したかったためだとわかりました。これは本当です。すべての頂点に法線の 3 つのコンポーネントを格納する代わりに、テクスチャ座標の 2 つのコンポーネントを法線マップに格納するだけで済みます。ただし、ピクセルごとのライティングを有効にすると、パフォーマンス コストが発生するため、これが最終的に得られるかどうかはわかりません。いつものように、試してみることをお勧めします。
最後に、点の拡散照明強度は、表面法線と光の方向の間の角度の余弦に比例します。2 つのベクトルの場合、内積は次のように定義されます。
a dot b = |a||b| cos(theta)
ここで|a|
、 およびはそれぞれベクトルおよび|b|
の長さであり、 はそれらの間の角度です。長さが 1 に等しく、単位ベクトルと呼ばれる場合、式は次のように簡略化されます。a
b
theta
|a|
|b|
a dot b = cos(theta)
これは、拡散照明の強度が、表面法線と光の方向との間の内積によって与えられることを意味します。これは、名前がピクセルごとの種類を指すようになったとしても、すべての拡散照明が DOT3 照明の形式であることを意味します。
ここから:
バンプマッピングは、各テクセルの明るさがそのテクセルの高さを定義するモデルにテクスチャを配置します。
次に、各テクセルの高さを使用して、サーフェス全体の照明を乱します。
法線マッピングは、各テクセルの色が実際には、サーフェス上の位置が指す方向を定義する 3 つの値であるモデルにテクスチャを配置します。
たとえば、(255, 0, 0) の色は、その位置のサーフェスが正の X 軸を下に向けていることを意味する場合があります。
つまり、各テクセルは法線です。
Dot3 の名前は、これらの法線で実際に行うことから来ています。
光源が指す方向を指すベクトルがあるとします。そして、モデルの特定のテクセルで、そのテクセルが指す方向を示す法線であるベクトルがあるとします。
これら 2 つの法線ベクトルに対して「内積」と呼ばれる単純な数式を実行すると、次のようになります。
ドット = N1x N2x + N1y N2y + N1z*N2z
結果の値は、これらの 2 つのベクトルが同じ方向をどれだけ指しているかを示す数値です。
値が -1 の場合、それらは反対方向を指します。これは、実際には、テクセルが光源を指しており、光源がテクセルを指していることを意味するため、テクセルを照らす必要があります。
値が 1 の場合、それらは同じ方向を指します。これは、テクセルが光源から離れていることを意味します。
値が 0 の場合、一方のベクトルは他方に対して 90 度を指します。つまり、前を向いて地面に立っている場合、ビュー ベクトルは、上を向いている地面の法線に対して 90 度です。