【问题标题】:How to generate normals for VBO?如何为 VBO 生成法线?
【发布时间】:2011-08-08 13:52:25
【问题描述】:

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

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

按照我的想法,这似乎是一项非常昂贵的任务;遍历所有顶点并计算使用该顶点的每个面的法线并进行平均。有没有更好/更快的方法来做到这一点?

干杯

克里斯

【问题讨论】:

    标签: opengl vbo normals


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!我就是这么想的。很高兴得到一点保证,这是一个正确的方法!
    【解决方案2】:

    正如您在此处看到的,OBJ 支持法线定义。为什么不让 3D 程序做艰苦的工作呢? :)

    【讨论】:

    • 应用程序从各地(不同的供应商等)接收模型,所以我不能总是保证会声明法线,特别是如果模型只包含几何信息。我有一些用于测试的模型,其中包括正常数据,它确实让生活变得轻松多了):p。对于那些不这样做的模型,我一生都无法弄清楚如何让 Cinema4d 生成法线:o
    • @Chris Robinson:好的...有点厚脸皮的 Cinema 4D 考虑到它必须有现成的信息,所以忽略它。
    • 我确定它有它可用,我只是没有时间筛选菜单来找到它:p 虽然他们没有让它变得微不足道,但这有点烦人。
    • @Chris Robinson:值得注意的是,模型生成的法线总是比重建法线具有更高的质量。原因是,美工确保建模器中的灯光看起来不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多