使用gl_quads仍有优势吗?


10

好的,我知道gl_quads已过时,因此我们不再“应该”使用它们。我也了解现代PC在使用gl_quads运行游戏时实际上会绘制两个三角形。

现在,我听说是因为应该使用三角形来编写游戏。但是我想知道,由于OpenGL如何将四边形变成两个三角形,是否仍然有利于使用四边形?

具体来说,我目前正在从相当大的缓冲区对象渲染许多未连接的四边形。我必须要注意的领域之一是,我用来制作/更新这些缓冲区对象的浮点矢量的大小(我每个顶点有很多额外的浮点值,并且缓冲区中有很多顶点-最大缓冲区约为500KB)。

因此,令我惊讶的是,如果我更改缓冲区对象以绘制三角形,则此顶点数据将大50%(六个正方形绘制一个正方形而不是4个顶点),并且CPU生成所需的时间要长50%。

如果gl_quads仍然有效,我在这里能受益吗?还是在OpenGL自动转换为两个三角形时仍在使用50%的额外内存和CPU时间?


5
我确定OpenGL支持某种索引的顶点缓冲区,这意味着您只为一个四边形存储相同的4个顶点,而不是重复整个顶点以形成两个三角形,而只需重复索引:[0,1,2] ,[2,3,0]


我认为GL规范仍然规定了将四边形作为绘图的某些情况,例如使用glPolygonMode(...,GL_LINE)。
Maximus Minimus

Answers:


5

测试您的实际游戏。如果Quad更快,请使用那些。如果没有,那就不要。

在某些情况下,由于某些硬件不支持四边形,因此可以认为它们速度较慢,因此驱动程序必须做大量工作才能“修复”四边形绘制调用。某些硬件确实支持四边形,并在某些固定功能的输入装配步骤中将其分割为三角形,因此它的工作量不大。正如您所提出的,还有一些问题涉及到如何将四边形提交给有索引的索引和无索引的索引,以及如何更好地利用有限的总线传输带宽和CPU生成时间。民间智慧说避免四边形,如果您从零开始,这是一个很好的建议,如果您的代码已经可以工作,那么可能就不那么重要了。民间智慧说,尽管有真实,表现良好的游戏正在做这些事情,但很多事情都在破坏性能。

总之,测试。不要假设,也不要向Internet寻求性能建议。有时我们可能是对的,但更经常的是,我们可能会向您提供过时的数据,基于您不在的特定情况的数据,或者是我们自己从互联网或同事那里(从他们自己可能不有第一手经验)。


3

有哪些选择?好吧,一种选择是使用“ 几何着色器”,传递一个GL_LINES_ADJACENCY图元(4个顶点),然后让GS将这个图元转换为三角形。但是,渲染速度会变慢,因为应该假定几何体着色器的渲染速度总是较慢。

更好的方法是使用索引呈现。在这里,您有两种选择:GL_TRIANGLESGL_TRIANGLE_STRIP使用原始重新启动。后者将导致索引缓冲区略短(每个四分之一索引)。您可以将同一索引缓冲区重新用于任何四边形渲染,因此无需更新或修改索引缓冲区。

我也建议使用无符号短裤作为索引类型。如果需要一次渲染超过16384个四边形,请使用glDrawElementsBaseVertex偏移索引以进行多个渲染调用。


我最近做过的一些基准测试表明glMultiDrawArrays现在在NV和AMD上都是一条捷径(对Intel一点也不打扰),因此还有另一种选择-带风扇或条形的glMultiDrawArrays。
Maximus Minimus 2013年

@ mh01:这需要绘制命令的客户端数组。您需要glMultiDrawArraysIndirect在GPU端执行此操作。您可以这样做,但是会限制硬件。
Nicol Bolas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.