gpt4 book ai didi

three.js - Three.js Normal Map Shader是在切线空间计算光照吗?

转载 作者:行者123 更新时间:2023-12-04 02:50:54 26 4
gpt4 key购买 nike

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

最佳答案

没有。照明计算在相机空间中完成。

tsb 矩阵,可能应该命名为 tbn 矩阵,将法线从切线空间 转换为相机空间.

您自己可以看到:如果 normalMap 是平面的,那么 normalTex 将是 ( 0, 0, 1 ),而当您通过 tbn 矩阵对其进行转换,您将获得归一化的 vNormal 作为结果。

three.js r.59

关于three.js - Three.js Normal Map Shader是在切线空间计算光照吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17773973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com