如何将Unity上下文放入OpenGL窗口

时间:2019-07-17 18:34:22

标签: c++ unity3d opengl textures

我想将unity上下文放入opengl,以便可以在opengl glfw窗口中显示unity渲染纹理。我尝试使用
oldContext = glfwGetCurrentContext();,但oldContext的值为null。

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

不能通过某些glGet * API像OpenGL状态相关的对象一样查询OpenGL context。上下文不是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。