如何将 Unity 上下文导入 OpenGL 窗口
How to Get Unity Context into OpenGL Window
我想将 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,如上所述。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 尝试导入pybind-opencv模块时出现libgtk错误
- 导入库可以跨dll版本工作吗
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- 建议在运行时将带有类实例的列表从c++导入qml
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 导入/导出变量时出错
- CMake on FindOpenGL.cmake 中的错误,当使用导入的目标 OpenGL::GLU?
- 如何将 Unity 上下文导入 OpenGL 窗口
- 用于将三维模型导入OpenGL/C++项目的推荐文件格式和图形库
- OpenGL中用于OBJ导入的平滑着色器
- c++ /OpenGL教程(导入图像)后的问题