Three.js法线贴图着色器是否计算切线空间中的照明?
我只是想熟悉Three.js,但遇到了一些奇怪的事情,我无法完全理解 在我使用的大多数其他系统(非基于web)中,法线贴图的照明是在切线空间中计算的。但是在Three.js中,情况有点不同。例如,如果考虑WebGLShaders.js第2643行的代码:Three.js法线贴图着色器是否计算切线空间中的照明?,three.js,Three.js,我只是想熟悉Three.js,但遇到了一些奇怪的事情,我无法完全理解 在我使用的大多数其他系统(非基于web)中,法线贴图的照明是在切线空间中计算的。但是在Three.js中,情况有点不同。例如,如果考虑WebGLShaders.js第2643行的代码: "mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );", "vec3 finalNormal = tsb * norma
"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时正确转换unity设置。这是我的最终目标。不。照明计算是在相机空间进行的
tsb
矩阵(可能应命名为tbn
矩阵)将法线从切线空间转换为摄影机空间
您可以自己看到:如果normalMap
是平面的,那么normalTex
将是(0,0,1)
,当您通过tbn
矩阵变换时,您将得到归一化的vNormal
3.js r.59