3

我只是想熟悉 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 输出时可以正确转换统一设置。那是我的最终目标。

4

1 回答 1

4

不,照明计算是在相机空间中进行的。

矩阵,tsb可能应该命名为tbn矩阵,将法线从切线空间转换为相机空间

您可以亲眼看到:如果normalMap是平坦的,那么normalTex将是( 0, 0, 1 ),并且当您通过tbn矩阵对其进行转换时,您将得到归一化vNormal的结果。

三.js r.59

于 2013-07-21T16:41:59.640 回答