2013-07-21 37 views
2

我只是想熟悉Three.js,遇到了一些奇怪的事情,我不能笼罩我的头。是Three.js法线贴图计算照明在切线空间吗?

在我使用的大多数其他系统(基于非网页)中,法线贴图的光照是在切线空间计算的。但在Three.js中,情况有点不同。例如,如果你在2643行考虑WebGLShaders.js代码:

"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输出时正确地转换统一设置。这是我的最终目标。

回答

3

否。照明计算是在相机空间进行的。

tsb矩阵,这或许应该被命名为tbn矩阵,转换成正常的切空间摄像机空间

您可以看到自己:如果normalMap持平,那么normalTex(0, 0, 1),当你变换由tbn矩阵,你会得到的归一化vNormal作为结果。

three.js r.59