从最一般的意义上来说,不行。OpenGL和Direct3D只允许每个顶点有一个索引;索引从每个顶点数据流中获取。因此,每个不同的组合都必须有自己单独的索引。
所以,如果你有一个立方体,其中每个面都有自己的法线,你将需要大量复制位置和法线数据。即使这个立方体只有8个唯一的位置和6个唯一的法线,你也需要24个位置和24个法线。
你最好接受你的数据会更大的事实。很多模型格式会使用多个索引;你需要在渲染之前修复这些顶点数据。很多网格加载工具,如Open Asset Importer,会为您执行此修复操作。
还应该注意的是,大多数网格不是立方体。大多数网格在绝大多数顶点上都是平滑的,只偶尔有不同的法线/纹理坐标等。因此,虽然这经常出现在简单的几何形状中,但真正的模型很少有大量的顶点重复。
GL 3.x和D3D10
对于D3D10/OpenGL 3.x级别的硬件,可以避免执行修复操作并直接使用多个索引属性。然而,请注意这可能会降低渲染性能。
以下讨论将使用OpenGL术语,但Direct3D v10及以上版本具有相当的功能。
想法是手动从顶点着色器中访问不同的顶点属性。传递的实际上是特定顶点的索引,而不是直接发送顶点属性。然后,顶点着色器使用这些索引通过一个或多个
缓冲纹理来访问实际属性。
属性可以存储在多个缓冲纹理中或全部存储在一个中。如果使用后者,则着色器将需要一个偏移量以添加到每个索引中,以便在缓冲区中找到相应属性的起始索引。
常规顶点属性可以以多种方式进行压缩。缓冲纹理具有较少的压缩方式,仅允许相对较
有限的顶点格式(通过它们支持的图像格式)。
请再次注意,任何这些技术都可能降低整体顶点处理性能。因此,在所有其他压缩或优化选项用尽之后,应仅在最受内存限制的情况下使用它。
OpenGL ES 3.0提供缓冲纹理。更高版本的OpenGL使用SSBOs可以更直接地读取缓冲对象,而不是缓冲纹理,这可能具有更好的性能特征。