使用opengl为stl顶点指定法线

时间:2014-10-26 10:41:28

标签: c++ opengl stl

在stl文件中,有facet法线,然后是verticies列表。在我使用的一些stl文件中,存在多个相同顶点,例如,具有500万个顶点的文件,通常包含每个顶点的30个重复。例如,从立方体切出的圆柱体,具有属于其他20个三角形的一个顶点。

出于这个原因,我喜欢将顶点存储在哈希表中,这允许我上传三角形的顶点索引集,将网格从500万个顶点减少到900k。

然而,这会为facet创建一个正常问题,它使用第一个facet normal指定给顶点的第一个实例。

存储顶点法线的最快方法是什么,该法线适用于它在文件中所属的所有方面,或者,这是不可能的?

2 个答案:

答案 0 :(得分:0)

顶点不仅仅是位置,顶点是其关联属性的整个元组。法线是顶点属性。如果顶点的任何属性不同,它们就是不同的顶点。

尽管将顶点属性分解为多个集合并使用中间索引结构是完全可能的,但这种数据格式很难甚至无法处理GPU,而且使用起来也非常麻烦。例如OpenGL不能直接使用它。

某些顶点属性的重复数据删除(如顶点之间共享的法线或其他属性)仅对存储数据有意义。当你想使用它时,你通常会扩展它。

您现在拥有的数据结构就是您想要的。不要试图“优化”它。即使在500万个顶点,给定两个属性(位置和法线),最多100MiB的数据。现代计算机有千兆字节的RAM,所以这不是一个真正的问题。

答案 1 :(得分:0)

OpenGL中唯一直接的方法是为位置和法线的每个唯一组合创建一个顶点。根据您的数据,这仍然可以显着减少顶点数量。但是,如果您的数据不包含共享位置和正常的重复顶点,则无效。

要验证这是否适用于您的数据,您可以扩展您已尝试过的方法。您可以使用6个值:3个顶点坐标和3个普通组件,而不是使用3个顶点坐标作为哈希表中的键。

如果哈希表中的条目数明显小于原始顶点数,则索引渲染将是有益的。然后,您可以为存储在哈希表中的每个唯一位置/正常组合分配索引,并使用这些索引来构建索引缓冲区以及顶点缓冲区。

除此之外,AMD定义了一个扩展来支持不同属性的单独索引,但如果你想保持代码的可移植性,这将没有用:GL_AMD_interleaved_elements