我们正在尝试为Java框架构建内置的游戏编辑器,该框架使用GLFW渲染游戏。
我们想使用imgui
在其之上构建编辑器也使用OpenGL,与GLFW相同。我们无法在Java框架中接触任何代码。
从技术上讲,可以使用imgui渲染游戏,而不是让我们的框架再次通过OpenGL渲染吗?
在其他情况下,我们需要采取任何必要的步骤以使其起作用吗?由于每个渲染调用都会交换缓冲区等...
答案 0 :(得分:1)
您还有另一个非常相关的问题here。我都会回答。
让我重新表达您的问题:“我有一个在其他应用程序(或应用程序中不可触摸的代码部分)中使用OpenGL渲染的窗口。在此窗口中添加我自己的渲染,添加还是替换像素?”
另一个应用程序(我们称其为“ appA”)已经完成了一些任务:创建了一个窗口,创建了一个gl-context(ctxA),将该上下文设置为某个线程的当前线程(thrA),完成了渲染并最终使用了{ {1}}在屏幕上查看结果。
最简单的情况是,当appA代码是您的appB代码的一部分,而appA尚未调用SwapBuffers,并且您拥有窗口句柄和ctxA时。然后,您可以执行相同的过程:将ctxA current设置为您的线程(如果可以访问,则为thrB或thrA,例如是同一主线程),渲染SwapBuffers。
==>但是您必须知道appA使用哪个OpenGL版本,并使用相同版本执行OpenGL工作。
==>您还必须确保当appB将ctxA设置为当前线程时,appA不会执行任何OpenGL命令。
更困难的情况是,您不确定appA是否同时渲染appB。您可以使用一个共享上下文 ctxB(因此它与ctxA most data共享),您可以将它设置为当前线程thrB。
==>问题在于,无法知道谁首先渲染了appA或appB。
如果您正在获取整个图片,那么您会发现主要问题是需要阻止appA调用SwapBuffers。如果有这种可能性,请在同一窗口中使用自己的ctx,线程和OpenGL内容。您应该能够通过SwapBuffers
读取默认的帧缓冲区。
最糟糕的情况是当您拥有窗口而没有其他任何东西时,或者已经调用了SwapBuffers时。您仍然有机会:使用代码注入。该技术从图形驱动程序中获取对SwapBuffers的调用。然后,在调用它时,对像素进行修改,并让SwapBuffers在抓取之前运行。