【问题标题】:How to Get Unity Context into OpenGL Window如何在 OpenGL 窗口中获取 Unity 上下文
【发布时间】:2019-07-17 18:34:22
【问题描述】:

我想将统一上下文导入 opengl,以便可以在 opengl glfw 窗口中显示统一渲染纹理。我尝试使用
oldContext = glfwGetCurrentContext();,但 oldContext 的值只是空值。

我正在尝试使用低级原生统一插件和 Texture.GetNativeTexturePtr

任何帮助将不胜感激!

【问题讨论】:

    标签: c++ unity3d opengl textures


    【解决方案1】:

    OpenGL context 不能通过某些 glGet* API 像 OpenGL 状态相关对象一样查询。上下文不是 OpenGL API 的一部分,它是您正在运行的系统的一部分,它的存在允许您维护 OpenGL状态并向驱动程序发出命令。您必须通过系统特定的 API 访问指向上下文的系统特定句柄。在 Windows (WinGDI) 上,这将是

    HGLRC wglGetCurrentContext();
    

    在 linux 上查看相关的GLX API。你需要找到函数才能访问GLXContext

    我在 Unity3D(帧缓冲读出插件)中做过一次。但它仅使用 Unity 的 OpenGL 或 DirectX 上下文来发出 API 命令。

    另外,我不确定您是否可以为不拥有该上下文的窗口“注入”或共享上下文。您会看到,当您(或 Unity)初始化显示时,它会创建上下文和相关的 GL 资源,例如默认的 FBO,其中包含所有必需的附件,并且该 FBO 被映射到一些系统资源(设备),该系统资源(设备)实际上负责呈现这些屏幕上的像素。因此,我不确定显示上下文是否可以像在线程之间共享上下文一样从一个窗口移动到另一个窗口。(但我可能错了)

    您可以在某个线程上创建您的插件窗口,并使用它自己的 GL 上下文。然后在这两者之间创建并共享一个纹理对象。请记住,GL 纹理是可共享的。如果您将 Unity 屏幕 FBO 中的内容复制到该纹理中,那么您也可以从该纹理将其复制到插件的屏幕 FBO 中。 顺便说一句,看看this SO question。你可以看到供应商特定的 GL 扩展,它允许将数据从不同的上下文复制到纹理中,而无需共享上下文、共享列表设置。

    关于 GLFW 为何返回您nullptr。在您的示例中,您使用 GLFW 库。

     glfwGetCurrentContext()
    

    但是如果你查看源代码,你会看到:

     GLFWAPI GLFWwindow* glfwGetCurrentContext(void)
     {
       _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
       return _glfwPlatformGetTls(&_glfw.contextSlot);
     }
    

    这可能意味着它从自己的缓存中而不是从系统中检索指向 GLFWWindow 的指针。如果您没有通过 GLFW 创建该上下文,您将不会获得任何有效的指针。因此,请尝试直接使用您的系统相关 API,如上所述。

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2012-09-11
      • 2016-08-22
      相关资源
      最近更新 更多