uv边界处的法线贴图接缝

时间:2015-11-08 13:38:44

标签: opengl math graphics directx

当我在我的应用程序中使用法线贴图时,我会得到这样的接缝 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

1 个答案:

答案 0 :(得分:1)

仔细观察渲染的输出,看起来就像右上角你有一种逆转的光线感。在左下方看起来你的表面上有树丛,在右上方看起来它们向外指向。这可能表明方向问题。

实际上,查看在漫反射贴图中渲染的法线贴图,您将拥有相同的边界。在继续之前,请确保“在漫反射纹理中渲染的法线贴图”无缝显示。

球体很棘手,因为你无法在整个球体上定义非消失的矢量场。 (Hairy ball theorem)这意味着你不能在整个球体上一致地定义切线和副法线向量,必须有一些跳跃。这可能不是一个很大的问题,因为普通地图是由单个部分组成的。有可能改变每个部分的向量tutv的意义。因此,对于某些部分,一个或另一个部分被颠倒tu'=-tutv'=-tv,或者可能两个部分的顺序相反。 tu'=tv, tv'=-tu。您将需要某种方式知道哪个补丁需要哪个转换。

解决问题的一个主要方法是从对象中移除顶部和底部。这将允许您将对象视为扭曲的圆柱体,可以对两个矢量具有一致的定义。

也许更好的解决方案可能是将法线贴图存储为三个组件,直接在每个点上给出3D法线。

假设我们不必担心90º以外的旋转,我们可以得到正方形的对称性

  1. No change tu'= tu,tv'= tv
  2. tu = 0 tu'中的反射= - tu,tv'= tv
  3. 电视中的反射= 0 tu'= tu,tv'= - tv
  4. 旋转90ºtu'= - tv,tv'= tu
  5. 旋转-90ºtu'= tv,tv'= - tu
  6. 旋转180ºtu= -tu,tv'= - tv
  7. 反射在tu = tv,tu'= tv,tv'= tu
  8. 反射在tu = -tv,tu'= - tv,tv'= - tu