【发布时间】:2013-08-28 21:03:34
【问题描述】:
我有一个顶点列表及其排列成三角形以及每个三角形的归一化法线向量。
理想情况下,我希望尽可能少地工作,以某种方式将 (triangle,normal) 对转换为 (vertex,vertex_normal) 对,以便我可以粘贴到我的 VAO 中。 OpenGL有没有办法直接处理面部法线?还是我必须跟踪给定顶点所涉及的每个面(在我计算索引缓冲区时或多或少已经发生),然后手动计算顶点的平均法线?
另外,有没有办法完全跳过每个顶点的法线计算,而只是找到一种方法直接通知面法线的片段着色器?
编辑:我正在使用应该可以移植到 ES 设备的东西,所以固定功能的东西是不可用的
【问题讨论】:
-
您是在问如何在着色器中计算每个顶点的法线,或者如何在不必复制位置数据的情况下为三角形使用面法线?
-
好吧,我目前有一堆面法线,如果可以的话,我宁愿不在 CPU 上计算顶点法线。此外,由于我有面部法线(而且我没有进行法线映射),因此插入顶点法线以查找片段法线似乎是一种浪费。
-
"如果可以的话,我宁愿不在 CPU 上计算顶点法线。" 为什么不呢?除非位置发生变化,否则它们不会改变。 CPU 是计算静态数据的最佳场所。此外,不清楚您是想在顶点上使用每个面的法线,还是想计算 real 顶点法线来创建平滑表面。你是平面阴影吗?
-
"如果我能让 GPU 为我处理它们,我宁愿不计算它们。" 为什么?就您的帧渲染时间而言,在 CPU 上执行一次是免费的。与 GPU 在每一帧上花费时间进行计算相比,这是一次性初始化成本。
-
@nimish 老实说,这些不是需要坚持的事情。您可以在创建顶点缓冲区以插入每个顶点法线之前简单地预处理网格数据。无论如何,您可能必须这样做,具体取决于您是要平滑(例如跨边缘平均)还是离散(每个方面唯一)法线。由于这发生在加载时,它不会影响您的模拟性能。