项目记录 : Unity-Android全景视频FOV渲染方案

由于是实验室项目.
具体代码不能提供. 只能提供一下做东西的思路. 以及可能涉及到的方案与问题.

0 项目概述

在渲染全景视频时. 基本的渲染方式是将整张全景视频(如ERP格式)贴到一个球上.
但是这样的效率其实是非常低的.浪费了很多资源.
因为用户只能观看到其视域范围内(FOV)的视频内容.

我们采用的是 低清的全景纹理 + 用户视域范围的Tile拼接方案 进行渲染.
这是一种 双Sphere 的渲染方案.

基于Tile-Wise方案.
最早的时候做了一次 SSE/NEON`快速指令集优化像素拷贝 .
但由于在CPU进行数据的拷贝非常耗时.
所以渲染的性能也不是很好.

于是. 实现了一套 Unity-Android全景视频FOV GPU渲染方案.
直接将Android MediaCodec硬解码出来的渲染到Surface的数据.渲染到Unity的物体Sphere表面.
其中. 核心采用的 渲染到纹理 FBO的技术.

1 系统架构

在这里插入图片描述
Unity 的 FOV 渲染实现思路:

  1. 由于在 Unity 端改变球的材质和 Mesh 网格实现起来是基本不行的.
    所以 Unity 端的渲染是不变的. 还是对 ERP 进行纹理采样.
    那么, 渲染 FOV 的核心就在于如何将解码得到的 Surface 数据采样成为正确的 Texture.

关键就在于: 建立 Surface 数据 与 ERP 中 FOV 的正确对应关系.

  1. 由于 Android 端硬解码输出 Surface 数据的 Tiles 是经码流融合的.

所以, 这里就是需要利用 TileMask 将 Surface 数据正确地转换为 FOV 纹理.

2 Tile 网格构建算法.

TileMask:

  • 采用 Long 数据类型存放,使用其中的低 42 位.存储视口信息,即那些 Tile 可见.

码流融合:

  • 在码流融合时,根据 TileMask 来构建 Merge 的纹理.其固定大小为 6x3 个 Tile.所以我们在重构也是利用 TileMask 来重构网格.

重构网格的计算原理:

  • 在预渲染的时候,就是渲染的一个 ERP. 其实就是 重新 计算分 划分 ERP 网格个 每个 Tile 的 的 纹理 采样 坐标.

举例:若橘色区域为 1.那么它需要还原到 ERP 中的 1 位置.

在这里插入图片描述

3 测试方案

3.1 测试数据生成(TileMask 码流对应 FOV 纹理的生成)

Unity 客户端根据 TileMask 来生成纹理采样坐标.
所以先有一组划分好的 tile 块.用于拼接成为 6x3 的 Merged 纹理.用于编码.
在这里插入图片描述
目前的测试结果
输入 FOV: 1 5 6 13 14 15 16 25 26 27 28 35 36
TileMask: 000001100000011110000000011110000001100010
拼接的码流(6x3个Tile)结果:
在这里插入图片描述

3.2 渲染结果:

在这里插入图片描述

4 系统Demo

在这里插入图片描述

Unity中,代码是用来实现游戏逻辑和功能的关键部分。Unity支持使用C#或UnityScript(一种基于JavaScript的脚本语言)编写代码。 在Unity中,代码通常被组织在脚本文件中,这些脚本文件可以附加到游戏对象上。当游戏运行时,这些脚本将被执行,并且可以通过调用函数、访问变量等方式来实现游戏的各种功能。 以下是一些常见的Unity代码概念和功能: 1. MonoBehaviour:MonoBehaviour是Unity中所有脚本的基类,它提供了一些常用的函数,如Start()、Update()等。通过继承MonoBehaviour类,可以创建自定义的脚本,并将其附加到游戏对象上。 2. GameObject:GameObject是Unity中的基本对象,它代表了游戏场景中的一个实体。可以通过代码创建、修改和销毁游戏对象,以及访问其属性和组件。 3. 组件(Component):组件是附加到游戏对象上的模块化功能单元。例如,Transform组件用于控制游戏对象的位置、旋转和缩放;Rigidbody组件用于模拟物理行为;MeshRenderer组件用于渲染3D模型等。可以通过代码访问和操作组件。 4. 事件(Event):Unity中的事件系统允许在特定条件下触发代码。例如,当玩家点击按钮时,可以触发一个OnClick事件,然后执行相应的代码逻辑。 5. 协程(Coroutine):协程是一种特殊的函数,可以在一段时间内暂停和恢复执行。协程常用于处理复杂的异步操作,如延迟执行、动画序列等。 6. 资源管理:Unity提供了资源管理系统,可以加载、实例化和销毁各种资源,如模型、纹理、声音等。通过代码可以访问和操作这些资源。 关于Unity代码的更多详细信息和示例,请参考Unity官方文档和教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值