【问题标题】:Rendering via OpenGL twice per frame, different libraries每帧通过OpenGL渲染两次,不同的库
【发布时间】:2018-06-19 13:47:42
【问题描述】:

我们正在尝试为我们的 java 框架制作内置游戏编辑器,它使用 GLFW 来渲染游戏。

我们想在它之上构建编辑器,使用imgui

它也使用 OpenGL,与 GLFW 相同。我们不能在我们的 java 框架中修改任何代码。

技术上是否可以使用 imgui 渲染游戏,而不是让我们的框架再次通过 OpenGL 渲染自己?

在其他情况下,我们是否需要采取任何必要的步骤才能使其发挥作用?由于每次渲染调用都会交换缓冲区等...

【问题讨论】:

  • glfw 是一个允许以统一方式创建 OpenGL 上下文跨系统的库。它允许您使用 OpenGL。 imgui 是一个使用 OpenGL 渲染 GUI 的库。

标签: java opengl editor


【解决方案1】:

您还有另一个非常相关的问题here。我都会回答。

让我改写你的问题:“我有一个窗口,它已在另一个应用程序(或我的应用程序的不可触摸代码部分)中使用 OpenGL 渲染。如何将我自己的渲染添加到此窗口,添加或替换像素?”

另一个应用程序(我们称之为“appA”)完成了一些任务:创建了一个窗口,创建了一个 gl-context (ctxA),将该上下文设置为某个线程 (thrA) 的当前上下文,完成渲染并最终使用 @ 987654323@在屏幕上查看结果。

最简单的情况是,appA 代码是 appB 代码的一部分,而 appA 尚未调用 SwapBuffers,而您拥有窗口句柄和 ctxA。然后您可以执行相同的过程:将 ctxA 当前设置为您的线程(thrB 甚至 thrA,如果您可以访问它,例如是同一个主线程),进行渲染调用 SwapBuffers。
==>但是您必须知道 appA 使用的是哪个 OpenGL 版本,并使用相同的版本执行您的 OpenGL 工作。
==>您还必须确保 appA 不执行任何 OpenGL 命令,而您的 appB 已将 ctxA 设置为您的线程的当前线程。

一个更困难的情况是当您不能确定 appA 是否在 appB 渲染的同时进行渲染。您可以使用 共享上下文 ctxB(因此它与 ctxA most data 共享),您将其设置为当前线程 thrB。
==>问题是无法知道谁先渲染,appA 还是 appB。

如果您了解整个情况,那么您会发现您的主要问题是您需要阻止 appA 调用 SwapBuffers。如果你有这种可能性,那么在同一个窗口中使用你自己的 ctx、thread 和 OpenGL 东西。您应该可以通过ReadPixels 读取默认帧缓冲区。

最坏的情况是当你有窗口而没有其他东西时,或者当 SwapBuffers 已经被调用时。你还有机会:使用代码注入。该技术从图形驱动程序中获取对 SwapBuffers 的调用。然后,当它被调用时,进行像素修改,让 SwapBuffers 像抓取之前一样运行。

【讨论】:

  • 感谢@Ripi2 的回复。我检查了代码(反编译的java),如下: 1. 我和框架可以在同一个线程中运行 3. 当帧开始时,它们绑定它们的帧缓冲区。之后我可以做我想做的事,这意味着 jimgui 渲染,之后他们清除所有内容,使用着色器,绑定纹理和交换缓冲区。 2. 但是我可以覆盖他们的渲染代码并更改顺序
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2014-07-28
  • 2014-08-12
  • 2022-11-15
相关资源
最近更新 更多