如何在不同情况下处理具有多个法线的顶点?

时间:2015-03-19 01:54:03

标签: c++ opengl indexing opengl-es normals

大家好!我目前正在使用OpenGL开展项目。我知道使用索引顶点属性进行渲染可以节省大量内存。这要求每个顶点属性都应该是唯一的,否则索引渲染的优势将不会成立。所以,问题就出现了:

说我想从OBJ文件渲染一个带有立方基础的雕像。据我所知,对于OBJ格式,一个顶点可以由多个方面共享。这意味着顶点可以用几个不同的法线指定,这些法线是共享顶点的面的法线。

情况1:对于雕像,我想平均每个顶点的法线以仅获得该顶点的一个法线,因此可以使用索引渲染。更重要的是,每个刻面内的插值法线使雕像外观更加流畅。

情境2:对于立方基础,我想在渲染不同的边时使用不同的法线来使顶面看起来像实际那样平坦。

是否有通用方法来处理上述情况?

我是否必须将雕像及其底座分成不同的物体并以不同的方式对待它们?

1 个答案:

答案 0 :(得分:1)

OBJ文件格式使其不必要地混淆(正如许多其他资源一样):它们混淆了“顶点”和“位置”这两个术语。

顶点是位置,法线和其他属性的整个元组。如果只更改其中一个属性,则会获得不同的顶点。就OpenGL而言,它处理顶点。因此,如果单个位置由多个方面共享,但在其他属性中存在差异,那么您将处理不同的顶点。

如果您想获得最佳性能,那么强烈建议将这些属性级几何规范扩展为顶级规范,并重建索引列表以引用顶点而不是属性(OBJ指属性)。

使用现代OpenGL,实际上可以有多个索引缓冲区,并且在顶点着色器中使用顶点ID来访问索引缓冲区以将索引导入属性缓冲区。可行?是;有效?与其说,它引入了双重间接。