我只是想熟悉 Three.js 并遇到了一些我无法完全理解的奇怪东西。
在我使用过的大多数其他系统(非基于网络)中,法线贴图的光照是在切线空间中计算的。但在 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 输出时可以正确转换统一设置。那是我的最终目标。