如何为VBO生成法线?

时间:2011-04-19 10:40:53

标签: opengl vbo normals

我为我的OpenGL应用程序实现了一个wavefront(OBJ)文件加载器,它为我提供了面部,纹理和顶点信息。但是,使用照明我显然需要正常的信息。我知道这样做的正确方法是采用包含三角形并标准化的3个顶点的叉积。这会导致您应用于所有3个顶点的法线是否正确?

但是,对于不在多边形边缘的面/三角形,每个顶点使用3次。所以我猜你只是用先前计算的法线平均每个新计算的法线?

这似乎是我想要这样做的一项非常昂贵的任务;迭代所有顶点并计算使用该顶点和平均的每个面的法线。有更好/更快的方法吗?

干杯

克里斯

2 个答案:

答案 0 :(得分:2)

是的,平均与顶点相邻的面的每面法线可以得到很好的结果。为了保持非常坚硬的边缘“硬”,您通常会在计算中引入角度限制,以保持> 90(或甚至更低的角度)度边缘接收平均法线。

我参与的OSS项目有freely available implementation这个算法。它是O(nlogn)并且在完全唯一的顶点上操作(每个面引用3个顶点,但每个顶点仅由一个面引用 - 将相同的顶点连接在一起在稍后阶段完成)。

如果你有完全不同的顶点(即每个顶点位置只存在一次),它可以在O(n)时间内完成,但是限制平滑边缘角度则更难以实现。

答案 1 :(得分:1)

正如您在此处所见,OBJ支持法线的定义。为什么不让3D程序努力工作呢? :)