如果我的模型的顶点不断变化,因此我需要在每个帧上重新绑定VBO上的所有信息,使用即时模式是否会更有表现?还是将所有数据立即传递到GFX卡的事实仍然是VBO的赎回因素?
根据第一个问题的答案,这是否意味着为每个网格保留世界矩阵比简单地转换几何图形并重新创建VBO更好?
与几乎所有性能问题一样,答案是:这取决于。影响因素很多,主要是您的确切使用模式以及OpenGL实现的特征。
尽管即时模式在很大程度上已被淘汰,并且已从现代OpenGL版本中删除,但是如果几何图形具有很高的动态性,则很难通过VBO获得更好的性能。
作为一个案例研究,我从事了一个业余项目(1)很长时间(并且有很长的休息时间)。在这种情况下,所有顶点坐标都是动态计算的,并且仅用于渲染一次。初始版本使用即时模式,因为它在这种情况下很方便,而当我编写即时模式时,即时模式还没有过时。几年后,我再次拿起它,并将其移植到Core Profile和ES 3.0时,最初我很难获得相同的性能。
您将不得不尝试各种选择,以找到最适合您的用例和平台的方案。常见选项包括:
glBufferSubData()分批使用将其输入VBO 。glBufferData()使用NULL数据指针进行调用,创建一个足以容纳您的数据的VBO 。然后使用glMapBuffer()或glMapBufferRange()映射缓冲存储器,然后将顶点数据写入映射的存储器。关于即时模式在当前GPU上的工作方式,存在一个普遍的误解(部分反映在其他答案中)。当前的GPU(据我所知)实际上不支持即时模式。当您进行即时模式调用时,驱动程序通常会将顶点数据放入缓冲区中,并在以后将这些缓冲区提交给GPU。因此,GPU最终将执行几乎相同的绘图。唯一的区别是构建缓冲区(通过使用基于VBO的图形),还是让驱动程序处理缓冲区(通过使用即时模式)。
立即模式绘制通常效率低下的主要原因是,它需要这么多的API调用,而不是因为GPU最终执行了什么。
(1)无耻的插头,如果有人想看看它是什么:http : //retokoradi.com/volume-rendering/。
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |