(转)计算切线空间

切线空间:

因为显卡一般是以三角形作为最小渲染单位的,我们假设三角形的三点为p1, p2, p3,设该三角形所对应的一个空间为(T,B,N), 其中T和B构成的平面就是三角形所在平面, 而T和B分别对应U和V方向,此空间
的作用是让任何向量从tangent space变换到world space(实际上我们最终要求的是反过来的,先这样好作说明,最后求逆即可)

那么P2-P1的向量p必定在T及B所构成的平面上,由此推出:

P2-P1 = (U2-U1)*T+(V2-V1)*B
P3-P1 = (U3-U1)*T+(V3-V1)*B

设v1=P2-P1; v2=P3-P1; s1=U2-U1; s2=U3-U1; t1=V2-V1; t2=V3-V1
整理得出如下矩阵:

|v1|     |s1  t1 |     |T|
|   | =  |          | *  |  |
|v2|     |s2  t2 |     |B|

v1 v2 s1 s2 t1 t2都是已知的,这样即可求得T和B,而N我们就用T和B的叉乘即可得到。

最后要T和B和N反过来作用向量从world space变换到tangent space, 我们只要对其求逆即可。


好了,有了这个,我们在作Normal map等处理时就可让光线变到切线空间中再乘上Noraml图中的法线即可。

<think>好的,我现在需要回答用户关于Unity中世界空间切线空间计算法线区别的问题。首先,我需要理解用户的问题,然后结合提供的引用资料,整理出两者的不同点。 用户的问题是:在Unity中,世界空间切线空间计算法线有什么区别?根据提供的引用内容,我需要从计算位置、数据存储、计算效率、适用场景等方面进行对比。 首先,引用[1]提到,若没有全局效果要求,优先使用切线空间计算,因为效率高;如果有全局效果要求,则使用世界空间。这说明两者的适用场景不同,效率也不同。 引用[3]详细解释了切线空间的结构,每个顶点都有自己的切线空间,其中z轴是法线方向,x轴是切线方向,y轴由叉积得到。这意味着在切线空间下,法线贴图存储的是相对于顶点自身的法线偏移,而世界空间下可能需要换到全局坐标系。 引用[2]提到了切线空间到世界空间换矩阵推导,这涉及到数学上的处理,可能涉及矩阵运算的不同。同时,引用[4]载的内容可能涉及具体的Unity实现细节,但需要确认是否在引用中有相关内容,但根据给出的引用,可能主要是关于换矩阵和存储方式的说明。 接下来,我需要整理出两者的区别点: 1. **计算位置**: - 切线空间:在顶点自身的坐标系中进行光照计算,法线贴图存储的是相对法线。 - 世界空间:将法线换到世界坐标系后进行光照计算,需要更多的矩阵变换。 2. **数据存储**: - 切线空间:法线贴图存储的是相对于顶点切线空间的法线方向,通常颜色值在切线空间中是固定方向。 - 世界空间:可能需要将法线贴图换到世界空间,但通常不直接存储世界空间法线,而是通过换矩阵处理。 3. **计算效率**: - 切线空间:效率更高,因为不需要频繁的矩阵换,尤其是在没有全局光照需求时。 - 世界空间:效率较低,但适合需要全局一致光照效果的情况,比如动态物体或复杂光照。 4. **适用场景**: - 切线空间:适用于静态物体或局部光照,如角色模型,因为法线方向不随物体旋而变化。 - 世界空间:适用于动态物体或需要与全局光照交互的情况,如移动的物体需要与环境光遮蔽或其他全局效果统一。 同时,需要考虑引用中的具体内容,比如引用[3]提到的同一平面顶点法线方向一致,确保数据唯一性,这可能影响在切线空间计算的稳定性。而引用[2]提到的换矩阵推导可能涉及数学处理的不同,比如行主序和列主序的问题,这在Shader编程中需要注意。 另外,需要确认是否有其他区别,比如光照计算的复杂度、法线贴图的生成方式等。但根据现有引用,可能主要集中在上述几个方面。 在整理这些点时,要确保引用正确的参考文献,例如切线空间计算效率高的原因来自引用[1],而切线空间的结构描述来自引用[3]等。 最后,用户可能还希望了解如何选择这两种方法,因此需要总结适用场景,并指出根据项目需求选择合适的方法。例如,如果物体需要旋或动态变化,世界空间可能更合适,而静态模型使用切线空间更高效。 总结后,答案的结构应该是分点对比,结合引用中的内容,确保每个区别点都有引用支持,并在末尾添加相关问题。</think>在Unity中,**世界空间**与**切线空间**下的法线计算主要有以下区别: --- ### 1. **计算坐标系与数据存储** - **切线空间** 每个顶点的法线、切线和副切线构成局部坐标系(即切线空间)。法线贴图中存储的法线向量是**相对于该局部空间**的偏移量,例如蓝色$(0,0,1)$表示与顶点法线方向一致[^3]。计算时,光照和法线方向直接在切线空间内完成,无需全局坐标系换[^1]。 ```glsl // Shader中切线空间法线计算示例(直接采样法线贴图) float3 normalTS = UnpackNormal(tex2D(_BumpMap, uv)); ``` - **世界空间** 法线贴图存储的是**世界空间下的绝对方向**(较少见),或通过换矩阵将切线空间法线换到世界空间。需额外计算**TBN矩阵**(Tangent-To-World矩阵),将法线从切线空间映射到世界空间[^2]: ```glsl // 构建TBN矩阵并换法线 float3x3 TBN = float3x3(worldTangent, worldBitangent, worldNormal); float3 normalWS = mul(TBN, normalTS); ``` --- ### 2. **计算效率** - **切线空间** 光照计算在局部坐标系完成,**无需频繁矩阵变换**,效率更高,适合静态物体或无需全局光照的场景。 - **世界空间** 需要将法线、光源方向、视线方向统一到世界空间,涉及更多矩阵运算,性能开销较大,但**适合动态物体或复杂光照交互**(如全局阴影、反射)[^1]。 --- ### 3. **适用场景** - **切线空间** - 静态模型(如场景建筑):法线方向不随物体旋变化,贴图可复用。 - 局部细节表现(如角色服装褶皱):法线贴图在切线空间内方向固定,旋模型时细节不变形。 - **世界空间** - 动态物体(如可旋的武器):需法线方向与全局光照(如环境光遮蔽)实时同步。 - 复杂光照(如多光源投影):统一坐标系简化光照计算逻辑[^4]。 --- ### 4. **数据唯一性** - 切线空间中,同一平面的顶点法线方向一致,避免了数据歧义。 - 世界空间中,法线方向依赖物体位置和旋,需动态更新TBN矩阵[^2]。 --- ### 总结对比表 | 特性 | 切线空间 | 世界空间 | |---------------------|-----------------------------------|-----------------------------------| | **计算效率** | 高(局部计算) | 低(需矩阵换)[^1] | | **动态适应性** | 弱(旋导致光照变化) | 强(光照与全局坐标系同步) | | **法线贴图复用性** | 高(方向与模型绑定) | 低(依赖物体位置/旋) | | **典型应用** | 静态模型、局部细节 | 动态物体、全局光照 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值