有没有办法将 unity 和 qt 同时嵌入进 qt 做成客户端

2023-10-16 18:54:36 +08:00
 txzh007

有没有办法将 unity 和 qt 同时嵌入进 qt 做成客户端,unity 在底部,web 为透明背景网页,最为 ui 交互. qt 或者 pyqt 都可以,尝试了 qt 的各种 layout,发现 unity 始终处于顶层,web 无法覆盖上去

1267 次点击
所在节点    程序员
17 条回复
liberize
2023-10-16 19:19:43 +08:00
我没用过 unity ,不过做过类似的,下面用 opengl 渲染,上面叠一个透明网页。
用的是 qml ,用 QQuickView 在 beforeRendering 里面调用 opengl 绘图,然后 setSource 设置一个 qml ,qml 里面有个 WebEngineView 设置`background: transparent`。这种方法需要调用 setClearBeforeRendering(false)。
ysc3839
2023-10-16 19:51:40 +08:00
为什么不直接在 Unity 里面内嵌 WebView ?也许有现成的支持透明的项目。
txzh007
2023-10-17 10:09:15 +08:00
@ysc3839 我们原本业务是 web+unity 推流,现在有个业务场景,需要在单机模式下,所以想做成客户端
txzh007
2023-10-17 10:10:05 +08:00
@liberize 感谢提供思路
txzh007
2023-10-17 10:11:01 +08:00
描述打错了,应该是 unity 和 web 同时嵌入 qt,作为桌面客户端
ysc3839
2023-10-17 11:30:48 +08:00
@txzh007 “web+unity 推流”具体是什么样的?浏览器里跑 Unity ?
txzh007
2023-10-19 19:21:01 +08:00
@ysc3839 unity renderstreaming, 服务器端进行渲染,画面通过 webrtc 传输,键鼠事件通过 webrtc datachanel 传输
ysc3839
2023-10-19 20:06:36 +08:00
@txzh007 但这和叠加有什么关系呢?原来是前端页面直接把内容叠加到 video 元素上吗?

如果一定要搞的话,有个仅支持 Win8 及以上,不跨平台的方案:
WebView 只能用 Edge WebView2 ,其中有个无窗口渲染的模式,可以拿到网页内容的 DXGI SwapChain 。
然后你还要拿到 Unity 渲染的 SwapChain ,然后用 DirectComposition 混合再输出到窗口上,可能还需要处理鼠标事件。
或者如果 Unity 本身就能传一个 SwapChain 进去然后叠加的话,那就省事了。

还有一种跨平台但性能很差的方案,WebView 用 CEF ,CEF 能拿到渲染后的 bitmap ,把这个 bitmap 直接叠加到 Unity 上即可。这种方案 CEF 渲染后需要把数据从显存拷到内存,叠加到 Unity 时又需要拷到显存,因此性能会很差。
ysc3839
2023-10-19 20:14:55 +08:00
在网上找到了一些资源,可以参考一下:
https://learn.microsoft.com/en-us/microsoft-edge/webview2/get-started/hololens2
https://github.com/gree/unity-webview 这个不支持 Windows
txzh007
2023-10-20 10:22:43 +08:00
@ysc3839 想法是 web 叠加到 unity 显示窗口,在关闭原来的 video 标签,就可以原用 unity 原生画面了,这样清晰度和流畅性就可以得到保证了,主要是 web 和 unity 两端都是开发好的,利用 https://github.com/Unity-Technologies/UnityRenderStreaming
txzh007
2023-10-20 10:32:03 +08:00
@ysc3839 感谢提供思路,在看 WebView2 相关的
ysc3839
2023-10-20 10:32:12 +08:00
@txzh007 直接窗口叠加的话似乎只有 Windows 支持?不知道其他平台是否支持透明窗口叠加。
而且还是得自己写代码处理,因为主流 WebView 原生的窗口模式都不支持背景透明。
可以用 Edge WebView2 的无窗口模式,直接把拿到的 swapchain 配合 DirectComposition 渲染出来,印象中是可以实现透明窗口的。
另一种是用 CEF 配合 UpdateLayeredWindow ,这种方案性能也会很差。
ysc3839
2023-10-20 11:11:41 +08:00
@txzh007 去搜索了下,Unity 似乎没有官方的方法获取 swapchain ?也许得改 UnityPlayer 的代码了?
简单看了下 UnityRenderStreaming 的代码,没找到哪里获取渲染后的画面,能否说一下?
ysc3839
2023-10-20 11:21:57 +08:00
@txzh007 又去搜索了下,似乎是可行的,不确定能否直接拿到 swapchain ,但是能叠加东西上去
https://github.com/Unity-Technologies/NativeRenderingPlugin/blob/master/PluginSource/source/RenderAPI_D3D11.cpp
txzh007
2023-10-20 16:55:05 +08:00
@ysc3839 unity UnityRenderStreaming 是将画面通过 webrtc 推流到 web 端,这个我是有现成的,目前是想将现有的 web 端 UI 和 unity 结合起来,将 web 端直接套壳在 unity 上,这样能最小的改动代码,然后获得几乎与原生一样的交互
ysc3839
2023-10-20 17:15:32 +08:00
@txzh007 我想问的是,UnityRenderStreaming 要把画面通过 WebRTC 发出去,首先得拿到画面吧?那拿到画面的这个逻辑在上述仓库的什么文件里?
不过目前大概是不需要考虑直接拿画面的方案了,建议看看 NativeRenderingPlugin 的方案。
txzh007
2023-10-22 13:03:43 +08:00
@ysc3839 感谢提供思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982541

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX