生成 GL VBO 数据的最佳实践

Posted

技术标签:

【中文标题】生成 GL VBO 数据的最佳实践【英文标题】:Best practices for generating GL VBO data 【发布时间】:2014-04-24 20:09:53 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

我建议避免定期更新 VBO,因为每次更新都会导致图形驱动程序停止运行或在后台导致额外的内存分配(使 GPU 能够继续渲染之前的帧而不会中断)。我写了一篇关于这个主题的博文,可能会有所帮助:http://blog.imgtec.com/powervr/how-to-improve-your-renderer-on-powervr-based-platforms

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

【讨论】:

以上是关于生成 GL VBO 数据的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 索引:查询生成器的最佳实践

Next.js 在组件内获取数据的最佳实践

生成 OAuth 令牌的最佳实践?

在 Typescript 应用程序中管理生成的 graphql 模式的最佳实践

生成重置密码令牌的最佳实践

参考令牌生成最佳实践