在Windows上共享OpenGL上下文

问题描述

我正在为图形引擎编写一个用OpenGL编写的插件(即.dll)。我的目标是在第二个窗口上镜像该窗口上的内容。好消息是图形引擎向设备上下文(hDC),渲染上下文(hRC)和渲染窗口(hWnd)公开了句柄。另一个好消息(我认为)是,由于我的插件以.dll的形式加载,因此将其加载到相同的地址空间中,因此不会与我想要的内容发生任何访问冲突实现。

我的目标是从图形引擎捕获像素并将其绘制到单独的窗口中,从而镜像显示内容(例如SDL2,glfw或什至只是常规的Win32窗口)。我的理解是,我需要使用图形引擎的上下文,然后我可以做一些事情,例如从图形引擎的帧缓冲区中读取内容,以将第二个窗口中的像素镜像为单独的纹理。

但是我该如何共享上下文以便访问纹理等?

我正在寻找this,它可能具有一些有用的功能(wglmakecurrent,wglGetCurrentContext等)来实现此任务。

任何人都可以确认我走在正确的轨道上,或向我指出一些解释此想法的资源吗?

其他相关内容:

  • 在Windows 10中工作
  • 使用C和C ++编程

编辑

这是我在Laod.dll中尝试的功能,以便从主应用程序帧缓冲区捕获像素:

   // Make the current context available
   wglMakeCurrent(mainApplication.hDC,mainApplication.hRC);

   glReadBuffer(GL_BACK);
   glPixelStorei(GL_PACK_ALIGNMENT,1);
   glReadPixels(0,400,GL_RGBA,GL_UNSIGNED_BYTE,framebufferCapture);

不幸的是,我刚刚得到了垃圾数据。我在正确的轨道上吗? 我尝试在下一个上下文中创建一个纹理,只是为了查看它的值是否大于1,但不是。我认为这是在告诉我上下文未共享(否则将返回唯一的纹理ID)。 / p>

解决方法

我能够弄清楚,而且我正在发布解决方案,因为我还没有看到其他人发布有效的代码段或正确的顺序。也许那里有一个更精简的解决方案,但这是在Windows 10上另一个应用程序中加载插件(作为.dll)的方法。

case class RoseTree[A](
  a: A,children: List[RoseTree[A]]
)

def unnest[A](tree: RoseTree[A]): List[List[A]] =
  tree match {
    case RoseTree(a,Nil) =>
      List(List(a))
    case RoseTree(a,children) =>
      children.flatMap(x => unnest(x).map(a :: _))
  }

val example = 
  RoseTree("John",List(
    RoseTree("Address A",List(
      RoseTree("123",Nil),RoseTree("345",Nil))),RoseTree("Address B",List(
      RoseTree("456",RoseTree("678",Nil))))

assert(unnest(example) == List(
  List("John","Address A","123"),List("John","345"),"Address B","456"),"678")))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...