java - 每帧通过 OpenGL 渲染两次,不同的库

标签 java opengl editor

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

我们想在它的基础上构建编辑器,使用 imgui

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

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

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

最佳答案

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

让我重新表述一下您的问题:“我有一个窗口,已在另一个应用程序中(或在我的应用程序的不可触摸代码部分中)使用 OpenGL 渲染。我怎样才能将我自己的渲染添加到此窗口,添加或替换像素?”

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

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

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

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

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

关于java - 每帧通过 OpenGL 渲染两次,不同的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930087/

相关文章:

c# - 同步多个 View 、编辑器和提交/取消

opengl - 这些矩阵模式有什么区别?

c++ - 如何为 OpenGL 的线条添加发光效果?

java - Java中多维数组的使用

java - 使用 Maven Central 作为辅助存储库

c++ - libGL 堆使用

ios - Xcode 7.2 语法高亮显示在 Swift 文件中闪烁

java - 如何从相应的 xsd'S 获取自己的 xml 编辑器的信息?

java - 将函数中的数组与空值进行比较

java - 如何根据feign.Response抛出异常?