计算顶点法线(OpenGL ES)时问题不大

| 我的顶点法线有点问题。 结果似乎有些奇怪。首先看一下图像: 3D软件中的原始模型。 每片段照明,其中网格直接从OBJ文件导入(使用文件中的法线)。 每片段照明,使用我自己的例程来计算法线。 你注意到了吗? 使用OBJ文件中的法线,一切正常。但是,当我使用自己的例程根据顶点计算法线时,似乎出现了问题。 当Z变为负值时(使用右手方向),法线正好看起来很奇怪。在对象的其他部分,一切都正常,但是跨网格的一条假想线似乎很奇怪。这个问题在其他网格上仍然存在,总是在同一位置,Z = 0。 我计算法线的例程是每个人都知道的,假设顶点ABC为三角形:
vec3 normal = normalize(cross(C - A, B - A));
然后将正常结果添加到已计算的正常缓冲区中。 我见过一些人在说要计算每个三角形的面积,然后将其乘以法线,甚至将其乘以缓冲区上法线和新法线之间的点积,但是我已经尝试了这些方法,捕获的变化很小,但是仍然存在相同的问题。 您以前看过吗?你知道怎么解决吗? 这是一些代码:
// Looping at each triangle
vec3 distBA = vec3Subtract(vB, vA);
vec3 distCA = vec3Subtract(vC, vA);

vec3 normal = vec3Cross(distBA, distCA);

// Each normalBuffer represents one vertex.
normalBuffer[i1] = vec3Add(normal, normalBuffer[i1]);
normalBuffer[i2] = vec3Add(normal, normalBuffer[i2]);
normalBuffer[i3] = vec3Add(normal, normalBuffer[i3]);

// After pass through all faces/triangles.

// Looping at each Vertex structure.
normal = vec3Normalize(normalBuffer[i]);
    
已邀请:
根据您计算每个片段照明的方式(即是否将点乘积限制在0-1范围内),您看到的可能只是法线倒置的问题。根据选择
A
B
C
的方式,顶点的法线可以指向任一方向。为了区分三角形的外部和内部,您通常需要更多信息,例如顶点的缠绕。您是否考虑到这一点?     
您是否要规范化“ \”的结果,然后将正常结果添加到已经计算的正常缓冲区中。”。我不确定您是否必须这样做,但是添加它不会有什么坏处。并且,在检查时,请检查NaN和无穷大。 如果输入的向量的长度大于0,您是否签入标准化函数? 我怀疑您的向量库中某处有一个讨厌的bug,尤其是因为问题仅发生在Z轴上。     

要回复问题请先登录注册