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

How to Get Unity Context into OpenGL Window

本文关键字:导入 OpenGL 窗口 上下文 Unity      更新时间:2023-10-16

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

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

任何帮助将不胜感激!

OpenGL 上下文不能像 OpenGL 状态相关对象一样通过某些 glGet* API 进行查询。上下文不是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 中。 顺便说一句,看看这个 SO 问题.您可以看到供应商特定的GL扩展,这些扩展允许将数据从不同的上下文复制到纹理中,而无需共享上下文,共享列表设置。

关于为什么GLFW返回你nullptr.在您的示例中,您使用 GLFW 库。

glfwGetCurrentContext()

但是如果你看一下源代码,你会看到这个:

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

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