不同情况下如何处理多条法线的顶点?

How to deal with vertex with several normals under different situations?

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

假设我想从 OBJ 文件渲染立方体底座的雕像。据我所知,对于 OBJ 格式,一个顶点可以由多个面共享。这意味着可以用几个不同的法线指定顶点,这些法线是共享顶点的小平面的法线。

情况一:对于雕像,我想对每个顶点的法线进行平均,得到该顶点只有一个法线,所以可以使用索引渲染。更重要的是,每个面内的插值法线使雕像的外观更加光滑。

情况2:对于立方体底,我想在渲染不同的边时对顶点使用不同的法线,使表面看起来像实际的平面。

有没有通用的方法来处理上述情况?

我是否必须将雕像及其底座分成不同的对象并区别对待?

OBJ 文件格式造成了不必要的混淆(许多其他资源也是如此):它们混淆了术语 "vertex" 和 "position"。

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

如果你想要最好的性能,那么强烈建议将那些属性级几何规范扩展到顶点级规范并重建索引列表以引用顶点而不是属性(OBJ 引用属性)。

使用现代 OpenGL,实际上可以有多个索引缓冲区,并且在顶点着色器中使用顶点 ID 访问索引缓冲区以将索引放入属性缓冲区。可行吗?是的;高效的?不是那么多,它引入了双重间接。