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