关于索引三角形或三角形条带之间的渲染性能,一直存在争议。但我相信有一个案例考虑得不够充分。
带索引的三角形在OpenGl:中的渲染方式如下
glDrawElements(GL_TRIANGLES, ...);
但出于某种原因,很多人只考虑以这种方式渲染条纹:
glDrawArrays(GL_TRIANGLE_STRIP, ...);
有一些非常好的索引器(Forsyth、Tipsify等(可以优化网格,方便GPU转换缓存在GL_TRIANGLES模式下渲染。理想情况下,它们可以实现每个三角形0.5个渲染顶点或类似的效果。
但为什么不这样做呢?
glDrawElements(GL_TRIANGLE_STRIP, ...);
我的意思是,将条形渲染的低索引带宽与上述索引器提供的高效GPU转换缓存使用相结合。经过一些修改,我说的对吗?一个可以优化条带以使其对Tcache友好的条带索引器可能是个好主意?
也许它不会达到0.5的目标,但至少可能达到0.6?此外,不要忘记巨大的索引带宽增益(可能是GL_TRIANGLES的三分之一(。
glDrawElements需要在调用时将数据从CPU传递到GPU。具体来说,最后一个参数是指向该数据的指针。
glDrawArrays不需要在调用时将数据传递给GPU。这可能就是为什么在卡上存储顶点/索引数据时通常不考虑glDrawElements的原因。