Opengl es 生成总账VBO数据的最佳实践

Opengl es 生成总账VBO数据的最佳实践,opengl-es,vbo,Opengl Es,Vbo,我是OpenGL ES新手,正在使用VBO加速大量对象的渲染。目前,我查询一个四叉树以确定哪些对象应显示在视口中,并使用该数据更新我的VBO,如下所示: glBufferData( GL_ARRAY_BUFFER, numObjects*sizeof(ObjectStruct), objects, GL_STREAM_DRAW ); 但这是最有效的处理方式吗?我应该避免查询四叉树,而只是生成一个包含所有对象信息的静态VBO。如果我这样做,GL是否足够

我是OpenGL ES新手,正在使用VBO加速大量对象的渲染。目前,我查询一个四叉树以确定哪些对象应显示在视口中,并使用该数据更新我的VBO,如下所示:

glBufferData(
     GL_ARRAY_BUFFER,
     numObjects*sizeof(ObjectStruct),
     objects, 
     GL_STREAM_DRAW
); 

但这是最有效的处理方式吗?我应该避免查询四叉树,而只是生成一个包含所有对象信息的静态VBO。如果我这样做,GL是否足够智能,能够剔除位于视口外部的对象?

在执行顶点变换之前,GL不会知道视图截锥体外部的对象。视图截锥体之外的对象将被剔除,以避免以后在管道中进行冗余操作。然而,这并不意味着驱动程序和GPU已经冗余处理了对最终图像没有影响的绘图

我建议避免定期进行VBO更新,因为每一次更新都会导致图形驱动程序暂停或导致额外的内存分配(使GPU能够继续渲染以前的帧而不中断)。我写了一篇关于这个主题的博客文章,这可能会有所帮助:

最佳方法取决于您的用例。理想情况下,可以将四叉树/八叉树节点中的多个对象批处理到单个绘图中。这样做可以使引擎减少提交的渲染工作量,而不会产生VBO修改的成本