V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
txzh007
V2EX  ›  程序员

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

  •  
  •   txzh007 · 194 天前 · 992 次点击
    这是一个创建于 194 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    还有一种跨平台但性能很差的方案,WebView 用 CEF ,CEF 能拿到渲染后的 bitmap ,把这个 bitmap 直接叠加到 Unity 上即可。这种方案 CEF 渲染后需要把数据从显存拷到内存,叠加到 Unity 时又需要拷到显存,因此性能会很差。
    ysc3839
        9
    ysc3839  
       191 天前 via Android
    在网上找到了一些资源,可以参考一下:
    https://learn.microsoft.com/en-us/microsoft-edge/webview2/get-started/hololens2
    https://github.com/gree/unity-webview 这个不支持 Windows
    txzh007
        10
    txzh007  
    OP
       190 天前
    @ysc3839 想法是 web 叠加到 unity 显示窗口,在关闭原来的 video 标签,就可以原用 unity 原生画面了,这样清晰度和流畅性就可以得到保证了,主要是 web 和 unity 两端都是开发好的,利用 https://github.com/Unity-Technologies/UnityRenderStreaming
    txzh007
        11
    txzh007  
    OP
       190 天前
    @ysc3839 感谢提供思路,在看 WebView2 相关的
    ysc3839
        12
    ysc3839  
       190 天前 via Android
    @txzh007 直接窗口叠加的话似乎只有 Windows 支持?不知道其他平台是否支持透明窗口叠加。
    而且还是得自己写代码处理,因为主流 WebView 原生的窗口模式都不支持背景透明。
    可以用 Edge WebView2 的无窗口模式,直接把拿到的 swapchain 配合 DirectComposition 渲染出来,印象中是可以实现透明窗口的。
    另一种是用 CEF 配合 UpdateLayeredWindow ,这种方案性能也会很差。
    ysc3839
        13
    ysc3839  
       190 天前 via Android
    @txzh007 去搜索了下,Unity 似乎没有官方的方法获取 swapchain ?也许得改 UnityPlayer 的代码了?
    简单看了下 UnityRenderStreaming 的代码,没找到哪里获取渲染后的画面,能否说一下?
    ysc3839
        14
    ysc3839  
       190 天前 via Android
    @txzh007 又去搜索了下,似乎是可行的,不确定能否直接拿到 swapchain ,但是能叠加东西上去
    https://github.com/Unity-Technologies/NativeRenderingPlugin/blob/master/PluginSource/source/RenderAPI_D3D11.cpp
    txzh007
        15
    txzh007  
    OP
       190 天前
    @ysc3839 unity UnityRenderStreaming 是将画面通过 webrtc 推流到 web 端,这个我是有现成的,目前是想将现有的 web 端 UI 和 unity 结合起来,将 web 端直接套壳在 unity 上,这样能最小的改动代码,然后获得几乎与原生一样的交互
    ysc3839
        16
    ysc3839  
       190 天前 via Android
    @txzh007 我想问的是,UnityRenderStreaming 要把画面通过 WebRTC 发出去,首先得拿到画面吧?那拿到画面的这个逻辑在上述仓库的什么文件里?
    不过目前大概是不需要考虑直接拿画面的方案了,建议看看 NativeRenderingPlugin 的方案。
    txzh007
        17
    txzh007  
    OP
       188 天前
    @ysc3839 感谢提供思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   959 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:39 · PVG 03:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.