繁体   English   中英

OpenGL:用于加载资源的辅助线程?

[英]OpenGL: secondary thread for loading resources?

使用C和Win32,我想知道如何实现辅助OpenGL线程来加载资源(纹理和VBO)。

根据我的发现,应该使用wglShareLists()完成此操作,但是我不确定如何设置辅助线程:

我需要一个新的设备上下文还是仅一个新的渲染上下文?

我需要调用哪些wgl函数?

您不需要新的上下文,因为您可以重用第一个设备的相同设备上下文。 顺便说一句,您可以指定另一个设备上下文,但是要根据您的平台而定(在Windows上,设备上下文必须具有相同的像素格式),否则可能无法在两个上下文之间共享对象

在主线程中创建两个上下文,第二个与第一个共享。 然后,在主线程上使第一个电流流过,而在辅助线程上使另一个电流流过。 请注意,您可以与任何渲染上下文共享:所有共享上下文均按其名称“看到”同一对象,实际上它们共享一个对象名称空间 可以使用两个不同的对象名称空间(即两个非共享上下文)来定义同一对象(即纹理对象名称为1),但是根据当前上下文,相同的名称实际上指向不同的对象。

由辅助线程创建的对象同时并一致地可见。 但是,并非所有对象都可以在上下文之间共享。 请记住,有时驱动程序支持意外对象,而有时驱动程序不正确支持预期对象。

OpenGL正在成为一种面向对象的语言。 您可以看到用于创建对象的特定模式:

  • 生成名称( GenTexturesGenBuffers
  • 定义对象( BindTextureBindBuffer
  • 对象存在( IsTextureIsShaderIsFramebuffer
  • 删除名称(和对象)

(请注意,使用Gen例程创建的对象仅在绑定时存在)

对象类可以是

  • 显示清单
  • 纹理对象
  • 缓冲对象
  • 着色器对象和程序对象
  • 渲染缓冲区对象
  • 帧缓冲对象
  • 查询对象
  • 同步对象
  • 转换反馈对象

我建议使用“运行时”测试,如下所示:

private bool TestSharingObject(RenderContext rContextShare)
{
    uint texture = 0;

    // rContextShader is a context sharing with this RenderCOntext

    this.MakeCurrent(true);

    if (Caps.TextureObject.Supported == true) {
        // Generate texture name
        Gl.GenTextures(1, out texture);
        // Ensure existing texture object
        Gl.BindTexture(Gl.TEXTURE_2D, texture);
        Gl.BindTexture(Gl.TEXTURE_2D, 0);
        // Self test
        if (Gl.IsTexture(texture) == false)
            throw new NotSupportedException();
    }

    // Make current sharing context
    rContextShare.MakeCurrent(true);

    return ((texture != 0) && (Gl.IsTexture(texture) == true));
}

另一个建议是在CPU密集的辅助线程操作上运行,而不直接影响绘图系统窗口缓冲区。 着色器编译是一个很好的例子,因为该编译器在CPU端运行。 还请记住,驱动程序可以使您的操作异步,并且OpenGL实现可能会流水线化不同的操作。

但是,您需要在辅助线程中加载资源,然后将其所有权传给主线程进行GL调用。

在GL上下文之间共享“列表” 应该起作用。 在主线程上执行所有GL调用确实可行:)

仅当wglShareLists由主线程为所有辅助线程完成时,它才有效! 使用消息映射,传递渲染上下文的引用,并使主线程创建渲染上下文,仅通过主线程使用wglShareLists。 然后使用主线程创建的渲染上下文在工作线程上调用wglMakeCurrent。 在渲染上下文上执行任何gl操作之前,必须先调用wglShareLists。 这是由于对参数hglrc2(与hglrc1共享显示列表的OpenGL渲染上下文)的要求所致,在调用wglShareLists时,它不应包含任何现有的显示列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM