在单个VAO中使用多个索引列表

时间:2011-11-21 00:50:08

标签: opengl opengl-3

我可能认为这一切都错了,但是嘿。

我正在渲染大量的墙段(为了论证,让我们说200)。每个部分都是一个单位高,均匀,笔直,没有对角线。方向的所有变化都是90度的变化 我代表每个人都是四角形三角扇,AKA是四角形。每个顶点都有一个与之关联的三维纹理坐标,例如0,0,0,0,1,7或10,1,129。

这一切都很好,但我不禁想到它会好得多。例如,每个点至少重复两次(每个墙是一个连续的线段,并且有一些三和四路交叉点)和起始角点纹理坐标(0,0,X和0,1,X)是对于纹理编号为X的每个墙都要复制。通过将O坐标移动到第三个属性并分别索引S和T坐标,可以进一步压缩它。

问题是,我似乎无法弄清楚如何做到这一点。 VAO似乎只允许一个索引,并且作为一个整体,每个位置和纹理坐标形成一个永远不会重复的独特雪花。 (不可否认,在某些角落可能不是这样,但这是一个非常有优势的案例)

我想做什么,或者我将不得不坚持使用目前使用的(当然很好的)方法?

2 个答案:

答案 0 :(得分:2)

这取决于你想做多少工作。

OpenGL 不直接允许您使用多个索引。但你可以得到同样的效果。

最直接的方法是使用Buffer Texture访问索引列表(使用gl_VertexID),然后使用该列表访问包含位置或纹理坐标的第二个缓冲区纹理。基本上,您将手动执行OpenGL自动执行的操作。由于属性设计为快速访问,因此每个顶点自然会更慢。您还会丢失一些压缩功能,因为缓冲区纹理不支持那么多格式。

答案 1 :(得分:2)

  

每个顶点和纹理坐标形成一个永远不会重复的独特雪花

顶点不仅仅是位置,而是由位置,纹理坐标和所有其他属性形成的整个矢量。它就是你所说的“雪花”。

只有200面墙,我不打扰内存消耗。它归结为缓存效率。并且GPU使用顶点 - 这意味着整个位置和其他属性向量 - 作为缓存键。任何像你想要的“优化”都可能会对性能产生负面影响。

但是如果它们在原始索引列表中相距不太远,那么拥有一些重复的顶点并不会造成太大的伤害。今天,GPU可以在其高速缓存中保持大约30到1000个顶点(即在变换之后,即着色器阶段),这取决于馈送的顶点属性的数量和传递到片段着色器级的变化变量的数量。因此,如果顶点(输入键)已被缓存,则不会执行着色器,而是将缓存的结果直接送入片段处理。

因此,您应该真正瞄准的优化是缓存局部性,即以某种方式批量处理,共享/重复的顶点会快速连续发送到GPU。