Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 索引GL_三角形与索引GL_三角形带_Performance_Opengl_Gpu_Gl Triangle Strip - Fatal编程技术网

Performance 索引GL_三角形与索引GL_三角形带

Performance 索引GL_三角形与索引GL_三角形带,performance,opengl,gpu,gl-triangle-strip,Performance,Opengl,Gpu,Gl Triangle Strip,关于索引三角形或三角形条带之间的渲染性能,一直有很多争论。但我认为有一个案例考虑得不够充分 索引三角形在OpenGl中的渲染方式如下: glDrawElements(GL_TRIANGLES, ...); 但是,由于某些原因,很多人只考虑用这种方式绘制条带: glDrawArrays(GL_TRIANGLE_STRIP, ...); 有一些非常好的索引器(Forsyth,Tipsify等)可以优化网格,以便于GPU变换缓存在GL_三角形模式下渲染。理想情况下,它们可以实现每个三角形0.5个渲

关于索引三角形或三角形条带之间的渲染性能,一直有很多争论。但我认为有一个案例考虑得不够充分

索引三角形在OpenGl中的渲染方式如下:

glDrawElements(GL_TRIANGLES, ...);
但是,由于某些原因,很多人只考虑用这种方式绘制条带:

glDrawArrays(GL_TRIANGLE_STRIP, ...);
有一些非常好的索引器(Forsyth,Tipsify等)可以优化网格,以便于GPU变换缓存在GL_三角形模式下渲染。理想情况下,它们可以实现每个三角形0.5个渲染顶点之类的效果

但为什么不这样做呢

glDrawElements(GL_TRIANGLE_STRIP, ...);
我的意思是,将条带渲染的低索引带宽与上述索引器提供的高效GPU转换缓存使用相结合。经过几次修改,我说的一个条带索引器可以优化条带,使其也对Tcache友好,这是对的吗


也许它不会达到0.5的目标,但至少可能达到0.6?另外,不要忘记巨大的索引带宽增益(相对于GL_三角形可能有三分之一)。

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


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

如今,索引带宽几乎不是一个问题。对于大多数使用情况,您可以在GPU上的静态VBO中存储索引。无论是使用共享元素(如扇形、条带)的基本体模式还是允许在基本体组装期间显式重用变换顶点的索引,post-T&L缓存都会使您受益。据说,按条带顺序排列的三角形列表与现代GPU上的条带一样高效,并且不需要特殊的原语重新启动索引。多年来,顶点变换在大多数渲染情况下都不是一个瓶颈,尽管使用细分后,您可能会看到新的兴趣。@AndonM.Coleman我同意您的观点,即如果索引数据已经在GPU中,那么两种绘图模式的效率是相同的。但如果顶点数据在VBO中,而索引数据不在VBO中,则情况肯定不同。如果由于某种原因,用户经常(可能每帧)将一组索引上载到GPU,发送的索引减少2.5-3倍确实会产生影响。@user2464424将顶点或索引数据保留在VBO中是不明智的。您依赖于驱动程序来计算要分页的数据量,并强制它在最无效的即时调用中上载整个数据。驱动程序还可以为每一个非常非常慢的绘图分配新的缓冲区。不使用VBOs也会终止间接调用等。这两种情况都有缓冲区对象,所以答案没有意义。索引数据也可以(通常是)在缓冲区中。总之,整个问题都是基于无效的假设,伊姆霍。将
glpaurements()
与索引三角形条一起使用是完全标准的。是的,在这种情况下,原语重新启动也非常有用。如果索引数据在缓冲区中,glpaurements的最后一个参数是什么?@Thomas。如果绑定了索引缓冲区(
GL\u ELEMENT\u ARRAY\u buffer
),则
glpaurements()
的最后一个参数是缓冲区中的相对偏移量(以字节为单位)。