7

关于索引三角形或三角形条带之间的渲染性能一直存在争议。但我相信有一个案例没有被充分考虑。

索引三角形在 OpenGL 中呈现如下:

glDrawElements(GL_TRIANGLES, ...);

但是由于某种原因,很多人只考虑以这种方式渲染条带:

glDrawArrays(GL_TRIANGLE_STRIP, ...);

有一些非常好的索引器(Forsyth、Tipsify 等等)可以优化您的网格,以便在 GL_TRIANGLES 模式下渲染 GPU 变换缓存。理想情况下,它们可以实现每个三角形 0.5 个渲染顶点或类似的东西。

但为什么不这样做呢?

glDrawElements(GL_TRIANGLE_STRIP, ...);

我的意思是,您将条带渲染的低索引带宽与上述索引器提供的高效 GPU 转换缓存使用结合起来。只需进行少量修改,我是否正确地说,将条带优化为对 Tcache 友好的条带索引器可能是个好主意?

可能不会达到 0.5 的目标,但至少可能达到 0.6?此外,不要忘记巨大的索引带宽增益(可能是 GL_TRIANGLES 的三分之一)。

4

1 回答 1

-1

glDrawElements 需要在调用时将数据从 CPU 传递到 GPU。具体来说,最后一个参数是指向该数据的指针。

glDrawArrays 不需要在调用时将数据传递给 GPU。这可能就是为什么在卡上存储顶点/索引数据时通常不考虑 glDrawElements 的原因。

于 2014-07-22T21:22:32.910 回答