Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js法线贴图着色器是否计算切线空间中的照明?_Three.js - Fatal编程技术网

Three.js法线贴图着色器是否计算切线空间中的照明?

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

我只是想熟悉Three.js,但遇到了一些奇怪的事情,我无法完全理解

在我使用的大多数其他系统(非基于web)中,法线贴图的照明是在切线空间中计算的。但是在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时正确转换unity设置。这是我的最终目标。

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

tsb
矩阵(可能应命名为
tbn
矩阵)将法线从切线空间转换为摄影机空间

您可以自己看到:如果
normalMap
是平面的,那么
normalTex
将是
(0,0,1)
,当您通过
tbn
矩阵变换时,您将得到归一化的
vNormal

3.js r.59