【问题标题】:Load Textures while rendering (OpenGL)渲染时加载纹理 (OpenGL)
【发布时间】:2012-12-15 13:45:42
【问题描述】:

我想在屏幕显示动画加载屏幕(使用 OpenGL 渲染)时加载一些网格,包括 OpenGL 纹理。

所以我在第二个线程中加载内容,这当然不起作用,因为我无法从两个线程访问相同的 GL 上下文。

我使用的是 SDL 1.2,整个东西必须独立于平台,所以我不能使用 wgl-stuff。

我有哪些可能性?

【问题讨论】:

    标签: c++ multithreading opengl textures openglcontext


    【解决方案1】:

    使用 Pixel Buffer Objects 为图像数据创建地址空间映射 (glMapBuffer),映射的 OpenGL 内存区域可以从进程的所有线程中访问。使用辅助线程将图像数据复制到其中,然后从主线程中的 PBO 复制 glUnmapBufferglTexImage。取消映射和纹理上传都是异步进行的,因此您已经可以处理下一张图像,而前一张图像仍会传输到快速内存中。

    那么,您所需要的只是一种在线程之间进行通信的方式,以便在线程之间进行下一步要执行的任务以及该任务何时完成。

    【讨论】:

      【解决方案2】:

      这肯定不是最优雅的解决方案,但您可以使用空栏绘制加载屏幕,加载一些资源并增加栏,然后再次绘制。重复,直到您加载所有内容。
      在伪:

      loadgraphics(){
        int progress=0;
        glClear(GL_COLOR_BUFFER_BIT);
        //draw you loading bar from 0 to progress
        //load something
        ++progress;
        SwapBuffers(hdc);
        glClear(GL_COLOR_BUFFER_BIT);
        //draw you loading bar from 0 to progress
        //load something
        ++progress;
        SwapBuffers(hdc);
        glClear(GL_COLOR_BUFFER_BIT);
        //draw you loading bar from 0 to progress
        //load something
        ++progress;
        SwapBuffers(hdc);
        glClear(GL_COLOR_BUFFER_BIT);
        //draw you loading bar from 0 to progress
        //load something
        ++progress;
        SwapBuffers(hdc);
        glClear(GL_COLOR_BUFFER_BIT);
        //draw you loading bar from 0 to progress
        //load something
        ++progress;
        SwapBuffers(hdc);
      }  
      

      这确实不是要走的路,但如果你只是想要一种快速而肮脏的方式,它就可以了。

      【讨论】:

        【解决方案3】:

        是的,您可以访问在另一个线程上创建的资源。 您需要做的是在辅助线程上创建辅助 opengl 上下文并使用 wglShareLists 在 2 个上下文之间共享数据。

        当然,在主线程上使用它之前,你需要再次绑定它。

        也检查这个问题 SDL / OpenGL: Implementing a "Loading thread"

        【讨论】:

        猜你喜欢
        • 2013-12-27
        • 2014-08-09
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 2012-08-23
        • 2019-04-02
        相关资源
        最近更新 更多