码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读


    monado系列文章索引汇总:
    openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读
    openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程
    openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor
    openxr runtime Monado 源码解析 源码分析:Prober设备发现和管理 system device HMD target instance
    openxr runtime Monado 源码解析 源码分析:InitializeSession client native multi_compositor client_compositor
    openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer

    目录

    说明

    用到的三个源码工程和功能概述

    OpenXR-SDK-Source

    openxr-android-broker

    monado

    三个代码库间的关系

    源码编译和运行效果

    源码编译

    运行顺序和效果

    hello_xr渲染部分源码分析

    hello_xr整体架构

    graphicsplugin_opengles模块

    App侧(client侧)渲染结果如何被Runtime合成的

    附录


    说明

    1 本文是系列文章的第一篇

    2 源码阅读基于安卓平台

    3 以Monado合成器系统(Compositor)为主线的源码分析

    4 此篇介绍整个分析过程中用到的开源工程,每个工程的作用

    5 重点分析hello_xr源码

    用到的三个源码工程和功能概述

    OpenXR-SDK-Source

    • 包含hello_xr源码,双目立方体绘制
    • OpenXR loader, validation layers的实现源码
    • 代码库 https://github.com/KhronosGroup/OpenXR-SDK-Source

    openxr-android-broker

    • 安卓版本用于发现和管理多个Runtime
    • 代码库 https://gitlab.freedesktop.org/monado/utilities/openxr-android-broker

    monado

    • 标准OpenXR Runtime实现,功能强大的Runtime开发调试集。
    • 代码库 https://gitlab.freedesktop.org/monado/monado

    三个代码库间的关系

    OpenXR文档给出了Application Loader Runtime三者的关系,如下图:

    原图参见:https://registry.khronos.org/OpenXR/specs/1.0/loader.html#Overview

    上图是抽象的模块关系表达,对应到三个源码库的关系如下:

    源码编译和运行效果

    源码编译

    每个工程都可以编译成独立的APK

    源码编译较简单,不再赘述,如果有疑惑,可以留言,我抽空补上一篇文章。

    推荐编译文章(未经作者授权):https://www.jianshu.com/p/6653507de3c6

    运行顺序和效果

    依次打开:

    (1)Monado XR(in-process下无界面)

    (2)OpenXR Runtime Broker,界面如下

    (3)Hello XR(OpenGL ES),也可以是Vulkan版本,后续基于GLES分析,效果如下:

    hello_xr渲染部分源码分析

    本文忽略loader模块,重点讨论渲染方面的内容。Vulkan太啰嗦,为了更容易搞明白怎么在App侧(Client端)渲染,以及与Monado互动过程,本节以OpenGL ES部分为分析对象。分为以下几个部分:hello_xr整体架构;OpenXrProgram模块;GraphicisPlugin_OpenGLES模块。

    hello_xr重点:app(client绘制的内容,如何被runtime合成的)

    hello_xr整体架构

    整体架构如下:

    main主进程:安卓NativeActivity主入口,用于加载OpenXR Runtime,创建平台相关对象(platformplugin_android),图形渲染库(graphicsplugin_opengles)。

    platformplugin_android:从源码里可以看出,demo支持win32 xlib xcb等平台,本文研究安卓平台,该模块提供几个重要字段:

      • XR_KHR_android_create_instance扩展
      • FormFactor: 'Hmd'
      • ViewConfiguration: 'Stereo'
      • EnvironmentBlendMode: 'Opaque'
      • AppSpace: 'Local'

    graphicsplugin_opengles:根据运行平台不同,Runtime暴露给App侧的渲染模块可以是D3D,Vulkan,OpenGL,OpenGL ES。Vulkan相对繁琐,本文以OpenGL ES作为梳理对象,以此整理App侧(client侧)渲染,渲染结果与Runtime合成关系。

    OpenXR Loader:标准加载器实现,将来扩展Runtime功能时可能用到,暂不研究。

    OpenXR Runtime:这里特指Monado开源引擎,后续文章会介绍。

    graphicsplugin_opengles模块

    这个模块主要是完成3D应用场景的绘制,简单一点用API裸写3D渲染,成熟做法是接入主流游戏引擎,如Unity UE Cocos等。熟悉OpenGL ES的同学打开graphicsplugin_opengles.cpp文件,可以清晰地看到几个关键模块:

    (1)利用三方库进行渲染环境创建ksGpuWindow_Create()

    1. EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
    2. eglInitialize(display, major, minor)
    3. EGLConfig eglGetConfigs()
    4. EGLContext eglCreateContext(d, c, NO_CONTEXT)
    5. EGLSurface eglCreatePbufferSurface(d, c)
    6. eglMakeCurrent(display, surface, context)

    重点:PBuffer,创建的是离屏渲染,因为合成展示在Runtime里完成。

    (2)GLES资源创建InitializeResources()

    1. glGenFramebuffers # 创建FBO
    2. glCreateProgram # 创建立方体绘制需要的shader
    3. glGenBuffers # 创建立方体VBO和IBO

    (3)3D场景绘制RenderView(layerView, swapchainImage)

    1. glBindFramebuffer()
    2. glViewport()
    3. glFrontFace(GL_CW)
    4. uint32_t colorTexture = reinterpret_cast<const XrSwapchainImageOpenGLESKHR*>(swapchainImage)->image;
    5. glFramebufferTexture2D(colorTexture| DEPTH)
    6. glClearColor()
    7. glClear()
    8. glUseProgram(m_program)
    9. 矩阵计算:fov pose(position orientation) scale,来自runtime模块
    10. glBindVertexArray(m_vao)
    11. // Render each cube
    12. glDrawElements()

    重点:可以看出App侧的Framebuffer的COLOR_ATTACHMENT0和DEPTH_ATTACHMENT来自Runtime的对象:SwapchainImage,也就是说客户端的画布是runtime创建,并通过纹理共享的,后续文章会详细介绍。

    App侧(client侧)渲染结果如何被Runtime合成的

    这块实现比较复杂,涉及到Runtime的合成器系统(compositor),可以先理解几个核心步骤,细节会在后续博文解读:

    (1)Runtime的主合成器(comp_compositor)创建Vulkan渲染环境

    (2)Runtime负责衔接Client端合成器(comp_multi_compositor)创建一个共享VK内存

    (3)多客户端合成器系统(multi_system_compositor)根据客户端的渲染环境,如GLES GL VK等,用步骤(2)创建的共享VK内存,创建新的纹理对象,如EGLImage,再创建glTexture,然后通过SwapchainImage接口返回给App层使用。

    这里一个技术要点是:基于HardwareBuffer的多线程纹理共享技术,具体参加附录。

    附录

    基于 HardwareBuffer 实现 Android 多进程渲染

    https://robot9.me/hardwarebuffer-multi-process-rendering/

    关键词 OpenXR Runtime Monado Compositor Vulkan OpenGL ES Swapchain hello_xr VR AR

  • 相关阅读:
    替代MySQL半同步复制,Meta技术团队推出MySQL Raft共识引擎
    第02篇:手写JavaRPC框架之设计思路
    在NLP中一下常见的任务,可以用作baseline;MRPC,CoLA,STS-B,RTE
    十大券商:“推土机行情”再现
    小程序社区团购demo
    TikTok的媒体革命:新闻业如何适应短视频时代?
    拓展2: Python Requests库的使用
    十四届蓝桥青少组模拟赛Python-20221108
    Linux程序的地址空间
    如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】
  • 原文地址:https://blog.csdn.net/xuer_07/article/details/127953477
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号