【问题标题】:Use triangle normals in OpenGL to get vertex normals在OpenGL中使用三角形法线来获取顶点法线
【发布时间】:2013-08-28 21:03:34
【问题描述】:

我有一个顶点列表及其排列成三角形以及每个三角形的归一化法线向量。

理想情况下,我希望尽可能少地工作,以某种方式将 (triangle,normal) 对转换为 (vertex,vertex_normal) 对,以便我可以粘贴到我的 VAO 中。 OpenGL有没有办法直接处理面部法线?还是我必须跟踪给定顶点所涉及的每个面(在我计算索引缓冲区时或多或少已经发生),然后手动计算顶点的平均法线?

另外,有没有办法完全跳过每个顶点的法线计算,而只是找到一种方法直接通知面法线的片段着色器?

编辑:我正在使用应该可以移植到 ES 设备的东西,所以固定功能的东西是不可用的

【问题讨论】:

  • 您是在问如何在着色器中计算每个顶点的法线,或者如何在不必复制位置数据的情况下为三角形使用面法线?
  • 好吧,我目前有一堆面法线,如果可以的话,我宁愿不在 CPU 上计算顶点法线。此外,由于我有面部法线(而且我没有进行法线映射),因此插入顶点法线以查找片段法线似乎是一种浪费。
  • "如果可以的话,我宁愿不在 CPU 上计算顶点法线。" 为什么不呢?除非位置发生变化,否则它们不会改变。 CPU 是计算静态数据的最佳场所。此外,不清楚您是想在顶点上使用每个面的法线,还是想计算 real 顶点法线来创建平滑表面。你是平面阴影吗?
  • "如果我能让 GPU 为我处理它们,我宁愿不计算它们。" 为什么?就您的帧渲染时间而言,在 CPU 上执行一次是免费的。与 GPU 在每一帧上花费时间进行计算相比,这是一次性初始化成本。
  • @nimish 老实说,这些不是需要坚持的事情。您可以在创建顶点缓冲区以插入每个顶点法线之前简单地预处理网格数据。无论如何,您可能必须这样做,具体取决于您是要平滑(例如跨边缘平均)还是离散(每个方面唯一)法线。由于这发生在加载时,它不会影响您的模拟性能。

标签: opengl opengl-es


【解决方案1】:

我不一定会谈论最新的全脂 OpenGL 规范,但肯定在 ES 中你必须自己完成这项工作。

虽然法线在旧的固定管道下像其他所有东西一样是模态的,但它附加到每个顶点。如果您选择平面着色模型,那么 GL 将使用面部第一个顶点处的颜色跨越整个事物,而不是对其进行插值。在 ES 下无法重现该行为。

属性是每个顶点的,制服是 - 充其量 - 每批。在 ES 中,没有办法指定每个三角形的属性,并且没有渲染管道的阶段,您可以在其中对几何图形进行概述,您可以将它们单独分配到每个顶点。每个顶点单独处理,变化是插值,然后每个片段单独处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2015-10-29
    • 2017-08-06
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多