我对顶点法线有一点问题。
结果看起来有些奇怪。首先看一下这些图片:
在3D软件中的原始模型。
使用从文件中导入的法线的Per-Fragment lighting,该文件是以OBJ格式导入的网格。
使用自己的程序计算法线的Per-Fragment lighting。
你注意到了吗? 使用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]);
z=0
线的单个三角形。这将清楚地显示问题的一部分是否在着色中。此外:禁用高光反射。总的来说,尽可能简化测试用例,以排除各种“干扰”。 - UncleZeiv