如何将Unity上下文嵌入到OpenGL窗口中

3
我想把 Unity 上下文嵌入 OpenGL,这样我就可以在 OpenGL GLFW 窗口中显示 Unity 渲染纹理。 我尝试使用
oldContext = glfwGetCurrentContext(); 但是 oldContext 的值为 null。
我正在尝试使用底层本地 Unity 插件和 Texture.GetNativeTexturePtr.
非常感谢任何帮助!
1个回答

0

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

HGLRC wglGetCurrentContext();

在Linux上,请参见相关GLX API。您需要找到访问GLXContext的函数。

我曾经在Unity3D中完成过这个(framebuffer readout插件)。但它仅使用了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进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接