我只是想熟悉一下Three.js,发现了一些奇怪的东西,我无法完全理解它。
在我使用过的大多数其他系统(非基于web的系统)中,普通地图的照明是在切线空间中计算的。但在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时正确地转换统一设置。这是我的终极目标。
发布于 2013-07-21 16:41:59
不是的。照明计算是在相机空间进行的。
tsb矩阵可能称为tbn矩阵,它将法线从正切空间转换为摄像机空间。
您可以自己看到:如果normalMap是平坦的,那么normalTex将是( 0, 0, 1 ),当您通过tbn矩阵对其进行转换时,您将得到规范化的vNormal。
three.js r.59号
https://stackoverflow.com/questions/17773973
复制相似问题