Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将纹理从一个OpenGL库复制到另一个库有哪些选项? 上下文_C++_Opengl_Graphics_Glfw - Fatal编程技术网

C++ 将纹理从一个OpenGL库复制到另一个库有哪些选项? 上下文

C++ 将纹理从一个OpenGL库复制到另一个库有哪些选项? 上下文,c++,opengl,graphics,glfw,C++,Opengl,Graphics,Glfw,我正在开发一个基于插件的体系结构,该体系结构旨在允许每个插件利用自己的图形API,只要它能够传递一个标准的纹理格式,引擎可以利用主OpenGL图形上下文和着色器摄取和渲染该格式。理想情况下,每个插件都不会知道或访问引擎正在使用的主OpenGL图形上下文。这意味着每个插件必须提供自己的上下文,并将图形渲染为纹理 问题 我当前的实现通过将纹理数据复制到CPU内存,然后将CPU内存复制回GPU,以便主OpenGL上下文进行渲染,从而将纹理从一个上下文复制到另一个上下文。因此,我运行的插件越多,我的软件

我正在开发一个基于插件的体系结构,该体系结构旨在允许每个插件利用自己的图形API,只要它能够传递一个标准的纹理格式,引擎可以利用主OpenGL图形上下文和着色器摄取和渲染该格式。理想情况下,每个插件都不会知道或访问引擎正在使用的主OpenGL图形上下文。这意味着每个插件必须提供自己的上下文,并将图形渲染为纹理

问题 我当前的实现通过将纹理数据复制到CPU内存,然后将CPU内存复制回GPU,以便主OpenGL上下文进行渲染,从而将纹理从一个上下文复制到另一个上下文。因此,我运行的插件越多,我的软件运行就越慢,因为这一切都发生在一个线程上。 我已经能够在一些罕见的场景中使用共享上下文,其中插件使用与主OpenGL图形上下文相同的图形API。否则,我无法使用共享上下文,因为像GLFW这样的库没有公开必要的API来实现与外部库的共享上下文

问题: 有什么解决方案可以提高将多插件实现渲染到纹理的性能,以便主上下文可以渲染到显示

其他想法 我目前的解决方案是尝试在一个单独的线程上运行每个插件,在这个线程中,内部上下文和渲染将发生,然后是一个同步点,所有插件都必须将其纹理复制回主线程上的主上下文。在我走这条路之前,我想确定没有其他可行的解决方案可以利用


如果绝对必要,我可以看到这样一个场景:我的软件传递主上下文,允许插件利用主上下文创建共享上下文。在这个场景中,我不需要将纹理复制到CPU内存中,只需将纹理的指针传递给CPU即可。这将是我试图解决的问题的最后一种解决办法。

没有免费的午餐。您为API不可知论付出的代价是,您放弃了API知识所允许的任何效率。OpenGL具有允许一个上下文与另一个上下文共享对象的机制。但是,如果您决定不知道/不关心某个插件是否正在使用OpenGL,则必须使用最低的常用demonator进行编码。对于这种情况,这意味着通过CPU复制纹理

这不会很快,但这正是你的设计选择引导你的方向

停止如此不可知论更容易或更合理。你应该告诉插件你正在使用OpenGL,他们也必须使用OpenGL。您应该让他们使用您创建的OpenGL上下文,这样您就可以与他们共享您的对象


这样做使一切变得非常简单。高效。

那又如何?@HolyBlackCat除非我弄错了,否则解决方案似乎依赖于GLFW API。因此,如果我的主上下文是GLFW,但我的插件API使用OpenSceneGraph来渲染图形,我将无法彼此共享它们的上下文。