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

0 项目概述

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

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

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

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

1 系统架构

android ui 渲染 unity安卓渲染_数据


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 位置.

android ui 渲染 unity安卓渲染_android ui 渲染_02

3 测试方案

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

Unity 客户端根据 TileMask 来生成纹理采样坐标.

所以先有一组划分好的 tile 块.用于拼接成为 6x3 的 Merged 纹理.用于编码.

android ui 渲染 unity安卓渲染_android ui 渲染_03


目前的测试结果

输入 FOV: 1 5 6 13 14 15 16 25 26 27 28 35 36

TileMask: 000001100000011110000000011110000001100010

拼接的码流(6x3个Tile)结果:

android ui 渲染 unity安卓渲染_全景视频_04

3.2 渲染结果:

android ui 渲染 unity安卓渲染_android ui 渲染_05

4 系统Demo

android ui 渲染 unity安卓渲染_数据_06