【问题标题】:Is it possible to create a openGL VBO/Display List in a non-main thread是否可以在非主线程中创建 openGL VBO/显示列表
【发布时间】:2013-11-30 14:22:13
【问题描述】:

我有一个运行良好的无限生成世界。每次生成新块时,它的高度图都会在第二个线程中生成。但是创建显示列表是不可能的,因为除了主线程之外的任何线程中都没有“GLContext”。这意味着每次生成一个新块时,都会出现一个小的延迟峰值,当同时生成几个块时,它会变得很明显。

我要问的是是否有办法在另一个线程中创建显示列表或顶点缓冲区对象,然后在主线程中绑定它或其他东西?

我已经尝试过使用 VBO,但与显示列表相比它非常慢。

【问题讨论】:

  • 是的,您需要使用多个渲染上下文来执行此操作,因为在任何给定时刻只有一个线程可以拥有上下文的所有权。此外,您需要启用多个上下文之间的资源共享。但是一旦你这样做了,某些类型的对象(比如缓冲区对象和显示列表)就可以在上下文之间共享。请注意,每个上下文都有自己独特的状态机,您真正共享的唯一内容是数据和缓冲区/显示列表名称。

标签: java multithreading opengl lwjgl


【解决方案1】:

一种可能更简单的方法是使用第二个线程在内存中生成 VBO 数据,然后使用异步数据从主线程传输到 GPU(使用现在无处不在的 GL_ARB_pixel_buffer_object)。

如今,从 VBO 渲染数据应该相当快。一定要使用glDrawElementsglMultiDrawElementsglPrimitiveRestartIndex 和其他家庭成员,以尽量减少draw call 的数量。然后根本不需要显示列表。

【讨论】:

  • 伙计,我非常感谢你为我提供的所有答案,我觉得我现在真的可以从事我的项目了。非常感谢你:-D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2011-09-04
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多