|
|
偶前几日翻出以前做的坦克模型想在D3D中进行NormalMap方式的渲染,结果发现坦克车体上几个面的高光、NormalMap的凹凸方向不对,后来经过多方跟踪调试,发现问题出在模型身上。共有两个问题:
一、原来模型在3DSMax里应用了UVW Map的修改器,而在该修改器里,U Tile的方向被Flip过,所以,贴图的U坐标轴实际是反的,而V轴不变。则按照ComputeTangent的算法,先把指向+V的Tangent单位向量求出来,然后最后再用Normal 叉乘 Tangent 求 Binormal,则此时叉乘出的Binormal和实际Binormal是方向正好是反的。不应该是Normal 叉乘 Tangent,而应该是Tangent 叉乘 Normal 才对。
所以微软等某些Tangent的算法是有缺陷的,它对应的3dsmax模型应该是UV Gizmo没有Flip或者旋转过的,而一般美工是很有可能对UVW Gizmo进行旋转操作的。我现在把Binormal的求解放到了Tangent一起,每求出一个Tangent则找出此Tangent对应的正确方向的Binormal,然后分别累加Tangent和Binormal。
二、UVW Map映射方式的问题。我的模型有些部件通过UVW Map中的Planar模式映射UV,则出现了这样的情况:构成一个面的3个顶点,其中1、2顶点的U坐标相同,1、3顶点的U坐标不同,1、2、3顶点的V坐标均相同,(U1 == U2 && U1 != U3 && V1 == V2 && V1 == V3),这样的面是无法得到正确的Tangent的,因为Tangent垂直于这个面。当然我们也可以假设在这个面中一条垂直于Binormal的向量为Tangent。但因尽量避免这种Planar模式对于一个物体映射UV的情况
总结一下,如果采用一般的Tangent求法,要做到UV坐标轴始终平行于每个面,而且不能对UV轴平面进行翻转(不是旋转)超过180度的操作。
大家可以这样试验一下,在3dsmax里新建一个Box,贴上贴图,然后是用UVW Map修改器,在UVW Map修改器中选择Box方式映射,然后再UTile后面的Flip炫项打勾,或者将UVWMap的Gizmo翻转180度以上,导出模型,最后在游戏中用NormalMap方式渲染模型,你会发现其中的凹凸效果完全是错误的。。。 |
|