为什么OpenGL不支持顶点属性的多个索引缓冲区呢?
对我而言,它似乎非常有用,因为您可以重复使用属性,并且您可以更好地控制几何体的渲染。
为什么所有属性数组都必须使用相同的索引,或者在不久的将来可以使用此功能?
答案 0 :(得分:5)
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个字节中。因此,除非多个属性共享相同的索引(法线和纹理坐标边缘发生在同一个位置,就像在多维数据集上可能发生的那样),否则在多数情况下,实际上会使这些数据更大。< / p>