私はちょうど Three.js に慣れようとしていたところ、頭を包み込むことができない奇妙なことに出くわしました。
私が使用した他のほとんどのシステム (非 Web ベース) では、法線マップのライティングは接線空間で計算されます。しかし、Three.js では事情が少し異なります。たとえば、WebGLShaders.js の 2643 行目のコードを検討すると、次のようになります。
"mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );",
"vec3 finalNormal = tsb * normalTex;",
接空間の正規直交基底行列を設定し、法線をその空間に変換します。ここまでは順調ですね。
問題は...ベクトルを接線空間に変換する唯一の場所のようです???
したがって、彼らが計算する光の方向ベクトルは接線空間に変換されず、目の方向ベクトルも変換されませんか??? これらは両方とも、2692 ~ 2694 行の照明を計算するために使用されます。
"vec3 pointHalfVector = normalize( pointVector + viewPosition );",
"float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
"float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );",
これは、私が慣れ親しんでいる鏡面反射光を計算する方法とは少し異なります。それで、彼らが何をしているのかを説明できる人がそこにいるのだろうかと思っていましたか? three.js の出力時にユニティ設定を適切に変換できるように、このシェーダーがどのように機能するかを知りたいです。それが私の究極の目標です。