opengl 使用多个索引渲染网格

0dxa2lsx  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一些顶点数据。位置,法线,纹理坐标。我可能是从.obj文件或其他格式加载的。也许我正在绘制立方体。但每个顶点数据都有自己的索引。我可以使用OpenGL/Direct 3D渲染这些网格数据吗?

qij5mzcb

qij5mzcb1#

OpenGL和Direct 3D只允许每个顶点有一个索引;索引从每个顶点数据流中获取。因此,每个组件的唯一组合都必须有自己的索引。
因此,如果你有一个立方体,每个面都有自己的法线,你将需要大量复制位置和法线数据。你将需要24个位置和24条法线,即使立方体只有8个 * 唯一 * 位置和6个唯一法线。
最好的办法是简单地接受你的数据将更大。很多模型格式将使用多个索引;你需要在渲染之前修复这个顶点数据。许多网格加载工具,如Open Asset Importer,将为你执行这个修复。
还应该注意的是,大多数网格 * 不是立方体 *。大多数网格在绝大多数顶点上都是平滑的,只是偶尔有不同的法线/纹理坐标/等。因此,虽然这经常出现在简单的几何形状中,但真实的模型很少有大量的顶点重复。

GL 3.x和D3 D10

对于D3 D10/OpenGL 3.x级别的硬件,可以避免执行修正,直接使用多个索引属性。但是,请注意,这可能会降低渲染性能。
以下讨论将使用OpenGL术语,但Direct 3D v10及以上版本具有等效功能。
这个想法是从顶点着色器手动访问不同的顶点属性。而不是直接发送顶点属性,传递的属性实际上是特定顶点的索引。顶点着色器然后使用索引通过一个或多个buffer textures访问实际属性。
属性可以存储在多个缓冲区纹理中,也可以全部存储在一个缓冲区纹理中。如果使用后者,则着色器将需要向每个索引添加偏移量,以便在缓冲区中找到相应属性的起始索引。
常规顶点属性可以通过多种方式压缩。缓冲区纹理的压缩方式较少,只允许相对有限的顶点格式(通过它们支持的图像格式)。
请再次注意,这些技术中的任何一种都可能会降低整体顶点处理性能。因此,它应该只用于内存最有限的情况下,在所有其他压缩或优化选项都已用尽之后。
OpenGL ES 3.0也提供了缓冲区纹理。更高的OpenGL版本允许您通过SSBOs更直接地读取缓冲区对象,而不是缓冲区纹理,后者可能具有更好的性能特性。

whhtz7ly

whhtz7ly2#

我找到了一种方法,可以让你减少这种重复,这与另一个答案中的一些陈述有点矛盾(但并不特别适合这里提出的问题)。
我刚刚学习了插值限定符。特别是“flat”。我的理解是,将flat限定符放在顶点着色器的输出上只会导致引发冲突的顶点将其值传递给片段着色器。
这意味着对于这段引文中描述的情况:
因此,如果你有一个立方体,其中每个面都有自己的法线,你将需要大量复制位置和法线数据。你将需要24个位置和24条法线,即使立方体只有8个独特的位置和6条独特的法线。
你可以有8个顶点,其中6个包含唯一的法线,2个法线值被忽略,只要你仔细地排列你的基本体索引,使得“挑衅顶点”包含你想要应用到整个面的法线数据。
编辑:我对它是如何工作的理解:


的数据




相关问题