使用 Qt 4.5 / 4.6 加载 OpenGL 线程平铺纹理

发布于 2024-08-19 06:20:12 字数 420 浏览 6 评论 0原文

我正在尝试在我的大学开发用于科学目的的地图应用程序。因此我可以访问很多图块(256x256)。我可以访问它们并将它们保存到单独的 QThread 中的 QImage 中。我的问题是,我如何才能真正设法将 QImage 加载到单独的 QThread(而不是 GUI 主线程)中的纹理中?或者更好地告诉我如何解决这个问题。

我想了解多线程 OpenGL,但我也需要 OpenGL 选择,并且我没有为此放弃任何有用的东西。#

如果您愿意,请给我指出任何有用的示例代码,我很感谢在 Linux 上编译的所有内容:)

注 1:我是使用基于事件的渲染,因此只有当场景发生变化时才会重绘。 注2:OSG 不是一个选项,它对于这个目的来说太重了,需要一种轻量级的方法。 注 3:该应用程序完全用 C++ 编写,

感谢您的回复。 PS 请耐心等待,我并不像本主题所暗示的那样先进。

I am trying to develop am map application for scientific purposes at my university. Therefor I got access to a lot of tiles (256x256). I can access them and save them to an QImage in a seperate QThread. My Problem is, how can I actually manage to load the QImage into a texture within the seperate QThread (not the GUI main thread)? Or even better give me a Tipp how to approach this problem.

I though about multithreaded OpenGL but I also require OpenGL picking and I did not fall over anything usefull for that.#

Point me to any usefully example code if you feel like, I am thankfull for everything that compiles on Linux :)

Note1: I am using event based rendering, so only if the scene changes it gets redrawn.
Note2: OSG is NOT an option, it's far to heavy for that purpose, a leightweight approach is needed.
Note3: The Application is entirely written in C++

Thanks for any reply.
P.S. be patient, I am not that adavanced as this Topic may (or may not) suggest.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下客 2024-08-26 06:20:12

OpenGL 不是线程安全的。一次只能在一个线程中使用一个 GL 上下文。根据操作系统的不同,您还必须明确放弃一个线程中的上下文句柄才能在另一个线程中使用它。

鉴于此处的瓶颈是显卡的带宽,您无法通过线程加速纹理加载。

让加载图块的交付线程填充环形缓冲区。 GL 线程从环形缓冲区获取数据。使用两个互斥体,可以轻松控制环形缓冲区以实现线程安全操作。

这就是我的建议。

OpenGL is not thread-safe. You can only use one GL context in one thread at a time. Depending on OS you also have to explicitely give up on the context handle in one thread to use it in another.

You cannot speed up the texture loading by threading given that the bottleneck here is the bandwidth to the graphics card.

Let your delivery thread(s) that load the tiles fill up a ring buffer. The GL thread feeds from the ring buffer. With two mutexes it is easy to control the ring buffer to make this thread-safe operation.

That would be my suggestion.

攒一口袋星星 2024-08-26 06:20:12

我使用两个技巧来加快速度:

  • 像素缓冲区对象:映射 GPU 内存,以便加载线程可以直接写入 GPU;
  • 同步对象:使用同步对象,我知道纹理何时真正准备好使用(带有 PBO 的 glTexImage2D 是异步的,因此不能保证纹理已准备好绑定,即,当绑定纹理时,如果 DMA 没有这样做,它会阻塞) t 完成更新纹理数据)

Two tricks I use to speed things up:

  • pixel buffer objects: map GPU memory so the loading thread can write directly to gpu;
  • sync objects: with a sync object I know when the texture is really ready to be used (glTexImage2D with PBO is async so there is no guarantee the texture is ready to be binded, ie, when binding a texture, it blocks if DMA didn't finish updating texture data)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文