我是OpenGL ES的新手,我正在使用VBO来加速大量对象的渲染。目前我查询四叉树以确定哪些对象应该出现在视口中并使用该数据来更新我的VBO,如下所示:
glBufferData(
GL_ARRAY_BUFFER,
numObjects*sizeof(ObjectStruct),
objects,
GL_STREAM_DRAW
);
但这是处理事情的最有效方式吗?我应该避免查询四叉树,只需生成一个包含所有对象信息的静态VBO。如果我这样做,GL是否足够聪明以剔除位于视口外部的对象?
答案 0 :(得分:1)
在执行顶点变换之前,GL不会知道视锥体之外的内容。视锥体外的对象将被剔除,以避免以后在管道中进行冗余操作。但这确实意味着驱动程序和GPU具有冗余处理的绘制,这对最终图像没有影响。
我建议避免定期的VBO更新,因为每个都会导致图形驱动程序停止或引起额外的内存分配(使GPU能够继续渲染以前的帧而不会中断)。我写了一篇关于这个主题的博客文章可能有所帮助:http://blog.imgtec.com/powervr/how-to-improve-your-renderer-on-powervr-based-platforms
最好的方法取决于您的用例。理想情况下,您可以将四叉树/八叉树节点中的多个对象批处理为单个绘制。这样做可以使您的引擎减少提交的渲染工作量,而不会产生VBO修改的成本