如何解决在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")))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。