由于是实验室项目.
具体代码不能提供. 只能提供一下做东西的思路. 以及可能涉及到的方案与问题.
0 项目概述
在渲染全景视频时. 基本的渲染方式是将整张全景视频(如ERP格式)贴到一个球上.
但是这样的效率其实是非常低的.浪费了很多资源.
因为用户只能观看到其视域范围内(FOV)的视频内容.
我们采用的是 低清的全景纹理 + 用户视域范围的Tile拼接方案 进行渲染.
这是一种 双Sphere 的渲染方案.
基于Tile-Wise方案.
最早的时候做了一次 SSE/NEON`快速指令集优化像素拷贝 .
但由于在CPU进行数据的拷贝非常耗时.
所以渲染的性能也不是很好.
于是. 实现了一套 Unity-Android全景视频FOV GPU渲染方案.
直接将Android MediaCodec硬解码出来的渲染到Surface的数据.渲染到Unity的物体Sphere表面.
其中. 核心采用的 渲染到纹理 FBO的技术.
1 系统架构
Unity 的 FOV 渲染实现思路:
- 由于在 Unity 端改变球的材质和 Mesh 网格实现起来是基本不行的.
所以 Unity 端的渲染是不变的. 还是对 ERP 进行纹理采样.
那么, 渲染 FOV 的核心就在于如何将解码得到的 Surface 数据采样成为正确的 Texture.
关键就在于: 建立 Surface 数据 与 ERP 中 FOV 的正确对应关系.
- 由于 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)结果: