【问题标题】:How to deal with vertex with several normals under different situations?不同情况下如何处理多个法线的顶点?
【发布时间】:2015-03-19 01:54:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

OBJ 文件格式造成不必要的混乱(就像许多其他资源一样):它们混淆了术语“顶点”和“位置”。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2021-10-20
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多