计算顶点法线(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]);
没有找到相关结果
已邀请:
2 个回复
疼嘶桐
,
,
的方式,顶点的法线可以指向任一方向。为了区分三角形的外部和内部,您通常需要更多信息,例如顶点的缠绕。您是否考虑到这一点?
呢率篓舍烫