有没有办法将 unity 和 qt 同时嵌入进 qt 做成客户端,unity 在底部,web 为透明背景网页,最为 ui 交互. qt 或者 pyqt 都可以,尝试了 qt 的各种 layout,发现 unity 始终处于顶层,web 无法覆盖上去
1
liberize 2023-10-16 19:19:43 +08:00 via Android
我没用过 unity ,不过做过类似的,下面用 opengl 渲染,上面叠一个透明网页。
用的是 qml ,用 QQuickView 在 beforeRendering 里面调用 opengl 绘图,然后 setSource 设置一个 qml ,qml 里面有个 WebEngineView 设置`background: transparent`。这种方法需要调用 setClearBeforeRendering(false)。 |
2
ysc3839 2023-10-16 19:51:40 +08:00 via Android
为什么不直接在 Unity 里面内嵌 WebView ?也许有现成的支持透明的项目。
|
5
txzh007 OP 描述打错了,应该是 unity 和 web 同时嵌入 qt,作为桌面客户端
|
7
txzh007 OP @ysc3839 unity renderstreaming, 服务器端进行渲染,画面通过 webrtc 传输,键鼠事件通过 webrtc datachanel 传输
|
8
ysc3839 2023-10-19 20:06:36 +08:00 via Android
@txzh007 但这和叠加有什么关系呢?原来是前端页面直接把内容叠加到 video 元素上吗?
如果一定要搞的话,有个仅支持 Win8 及以上,不跨平台的方案: WebView 只能用 Edge WebView2 ,其中有个无窗口渲染的模式,可以拿到网页内容的 DXGI SwapChain 。 然后你还要拿到 Unity 渲染的 SwapChain ,然后用 DirectComposition 混合再输出到窗口上,可能还需要处理鼠标事件。 或者如果 Unity 本身就能传一个 SwapChain 进去然后叠加的话,那就省事了。 还有一种跨平台但性能很差的方案,WebView 用 CEF ,CEF 能拿到渲染后的 bitmap ,把这个 bitmap 直接叠加到 Unity 上即可。这种方案 CEF 渲染后需要把数据从显存拷到内存,叠加到 Unity 时又需要拷到显存,因此性能会很差。 |
9
ysc3839 2023-10-19 20:14:55 +08:00 via Android
在网上找到了一些资源,可以参考一下:
https://learn.microsoft.com/en-us/microsoft-edge/webview2/get-started/hololens2 https://github.com/gree/unity-webview 这个不支持 Windows |
10
txzh007 OP @ysc3839 想法是 web 叠加到 unity 显示窗口,在关闭原来的 video 标签,就可以原用 unity 原生画面了,这样清晰度和流畅性就可以得到保证了,主要是 web 和 unity 两端都是开发好的,利用 https://github.com/Unity-Technologies/UnityRenderStreaming
|
12
ysc3839 2023-10-20 10:32:12 +08:00 via Android
@txzh007 直接窗口叠加的话似乎只有 Windows 支持?不知道其他平台是否支持透明窗口叠加。
而且还是得自己写代码处理,因为主流 WebView 原生的窗口模式都不支持背景透明。 可以用 Edge WebView2 的无窗口模式,直接把拿到的 swapchain 配合 DirectComposition 渲染出来,印象中是可以实现透明窗口的。 另一种是用 CEF 配合 UpdateLayeredWindow ,这种方案性能也会很差。 |
13
ysc3839 2023-10-20 11:11:41 +08:00 via Android
@txzh007 去搜索了下,Unity 似乎没有官方的方法获取 swapchain ?也许得改 UnityPlayer 的代码了?
简单看了下 UnityRenderStreaming 的代码,没找到哪里获取渲染后的画面,能否说一下? |
14
ysc3839 2023-10-20 11:21:57 +08:00 via Android
@txzh007 又去搜索了下,似乎是可行的,不确定能否直接拿到 swapchain ,但是能叠加东西上去
https://github.com/Unity-Technologies/NativeRenderingPlugin/blob/master/PluginSource/source/RenderAPI_D3D11.cpp |
15
txzh007 OP @ysc3839 unity UnityRenderStreaming 是将画面通过 webrtc 推流到 web 端,这个我是有现成的,目前是想将现有的 web 端 UI 和 unity 结合起来,将 web 端直接套壳在 unity 上,这样能最小的改动代码,然后获得几乎与原生一样的交互
|