当我在我的应用程序中使用法线贴图时,我会得到这样的接缝 enter image description here
我认为切线有问题 我从Rastertek.com
计算出这个函数vector1[0] = vertex2.x - vertex1.x;
vector1[1] = vertex2.y - vertex1.y;
vector1[2] = vertex2.z - vertex1.z;
vector2[0] = vertex3.x - vertex1.x;
vector2[1] = vertex3.y - vertex1.y;
vector2[2] = vertex3.z - vertex1.z;
tuVector[0] = vertex2.tu - vertex1.tu;
tvVector[0] = vertex2.tv - vertex1.tv;
tuVector[1] = vertex3.tu - vertex1.tu;
tvVector[1] = vertex3.tv - vertex1.tv;
den = 1.0f / (tuVector[0] * tvVector[1] - tuVector[1] * tvVector[0]);
tangent.x = (tvVector[1] * vector1[0] - tvVector[0] * vector2[0]) * den;
tangent.y = (tvVector[1] * vector1[1] - tvVector[0] * vector2[1]) * den;
tangent.z = (tvVector[1] * vector1[2] - tvVector[0] * vector2[2]) * den;
binormal.x = (tuVector[0] * vector2[0] - tuVector[1] * vector1[0]) * den;
binormal.y = (tuVector[0] * vector2[1] - tuVector[1] * vector1[1]) * den;
binormal.z = (tuVector[0] * vector2[2] - tuVector[1] * vector1[2]) * den;
我使用Vertex法线但是当我使用面法线时没有区别我得到相同的图片
我该如何解决这个问题
这是在漫反射纹理中渲染的法线贴图的图片 enter image description here
答案 0 :(得分:1)
仔细观察渲染的输出,看起来就像右上角你有一种逆转的光线感。在左下方看起来你的表面上有树丛,在右上方看起来它们向外指向。这可能表明方向问题。
实际上,查看在漫反射贴图中渲染的法线贴图,您将拥有相同的边界。在继续之前,请确保“在漫反射纹理中渲染的法线贴图”无缝显示。
球体很棘手,因为你无法在整个球体上定义非消失的矢量场。 (Hairy ball theorem)这意味着你不能在整个球体上一致地定义切线和副法线向量,必须有一些跳跃。这可能不是一个很大的问题,因为普通地图是由单个部分组成的。有可能改变每个部分的向量tu
和tv
的意义。因此,对于某些部分,一个或另一个部分被颠倒tu'=-tu
,tv'=-tv
,或者可能两个部分的顺序相反。 tu'=tv, tv'=-tu
。您将需要某种方式知道哪个补丁需要哪个转换。
解决问题的一个主要方法是从对象中移除顶部和底部。这将允许您将对象视为扭曲的圆柱体,可以对两个矢量具有一致的定义。
也许更好的解决方案可能是将法线贴图存储为三个组件,直接在每个点上给出3D法线。
假设我们不必担心90º以外的旋转,我们可以得到正方形的对称性