为啥OpenGL不支持多索引缓冲?
Posted
技术标签:
【中文标题】为啥OpenGL不支持多索引缓冲?【英文标题】:Why does OpenGL not support multiple index buffering?为什么OpenGL不支持多索引缓冲? 【发布时间】:2017-05-18 11:32:14 【问题描述】:为什么 OpenGL 还不支持顶点属性的多个索引缓冲区?
对我来说,这似乎非常有用,因为您可以重复使用属性,并且可以更好地控制几何体的渲染。
是否所有属性数组都必须采用相同的索引,或者该功能在不久的将来是否可用?
【问题讨论】:
【参考方案1】:OpenGL(和 D3D。还有 Metal。还有 Mantle。还有 Vulkan)不支持这个,因为硬件不支持这个。硬件不支持这一点,因为对于绝大多数网格数据,这无济于事。这主要适用于主要不平滑的网格(顶点共享位置但不共享法线等)。而且大多数网格都是光滑的。
此外,这通常是内存与性能之间的权衡。访问您的顶点数据可能会更慢。与单个交错获取的情况相比,GPU 必须从内存中的两个不同位置获取。虽然缓存有帮助,但多索引访问的缓存一致性比单索引访问更难控制。
出于这个原因,硬件不太可能支持这一点。但它也不太可能支持它,因为you can do it yourself。无论是通过buffer textures、image load/store 还是SSBOs,您都可以随心所欲地获取顶点数据。既然可以,硬件制造商真的没有理由开发特殊的硬件来帮助你。
此外,您是否真的要缩小顶点数据也存在疑问。在多索引渲染中,每个顶点由一组索引定义。好吧,每个索引都占用空间。如果模型中有超过 64K 的属性(在许多情况下几乎不是一个不合理的数字),那么每个索引需要 4 个字节。
可以使用GL_INT_2_10_10_10_REV
和规范化以4 个字节提供法线。 2D 纹理坐标也可以存储在 4 个字节中,作为一条短裤。颜色可以存储在 4 个字节中。因此,除非多个属性共享相同的索引(法线和纹理坐标边缘发生在同一个位置,就像立方体上可能发生的那样),在许多情况下,您实际上会通过这样做使您的数据更大。
【讨论】:
以上是关于为啥OpenGL不支持多索引缓冲?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用新的 Android Multidex 支持库启用多索引