渲染与多个索引网格
我有一些顶点数据。 位置,法线,纹理坐标。 我可能从.obj文件或其他格式加载它。 但是每一个顶点数据都有自己的索引。 我可以使用OpenGL / Direct3D渲染这个网格数据吗?
在最一般的意义上,没有。 OpenGL和Direct3D只允许每个顶点有一个索引; 索引从每个顶点数据stream中提取。 因此,组件的每个独特组合都必须有自己独立的索引。
所以如果你有一个立方体,每个面都有自己的法线,那么你需要复制这个位置和正常的数据。 即使立方体只有8个独特的位置和6个独特的法线,您将需要24个位置和24个法线。
最好的办法是简单地接受你的数据会更大。 许多模型格式将使用多个索引; 你需要修正这个顶点数据,然后才能使用它。 许多网格加载工具(如Open Asset Importer)将为您执行此修复程序。
GL 3.x和D3D10
对于D3D10 / OpenGL 3.x级硬件,可以避免执行修复并直接使用多个索引属性。 但是,请注意,这可能会降低渲染性能。
以下讨论将使用OpenGL术语,但Direct3D v10及更高版本具有相同的function。
这个想法是从顶点着色器手动访问不同的顶点属性。 而不是直接发送顶点属性,传递的属性实际上是该特定顶点的索引。 顶点着色器然后使用索引通过一个或多个缓冲区纹理来访问实际属性。
属性可以存储在多个缓冲区纹理中,或者全部在一个中。 如果使用后者,则着色器将需要一个偏移量来添加到每个索引,以便在缓冲区中find相应属性的起始索引。
规则的顶点属性可以用许多方式压缩。 缓冲区纹理压缩的手段较less,只允许数量相对有限的顶点格式(通过它们支持的图像格式)。
请再次注意,任何这些技术都可能会降低整个顶点处理性能。 因此,只有在所有其他压缩或优化选项已用尽的情况下,才应该在最受内存限制的情况下使用。
OpenGL ES 3.0也提供了缓冲区纹理。