全景图即HDRI贴图,可以代替6面cubemap,传统3D软件运用较为广泛。一般反射探针,天空盒等都会用到。

但是体积过大是个问题,特别是移动端会对包体大小进行控制,虽说可以通过球面贴图替换掉部分环境类贴图,但适用范围依然有限。

这里通过镜像的方式来做贴图大小的优化,可将贴图优化到原先的一半大小。

原图如下(网络收集):

最终效果(左右上下镜像):

github上有一些Equirectangular map的转换函数,类似球面坐标,直接拿来主义了。

参考:

https://github.com/tolotratlt/UnityPhotosphericView

https://github.com/Mapiarz/CubemapToEquirectangular

经过测试是可以x,y轴镜像的,首先需裁剪原始HDRI图片。直接用Texture2D的Resize裁一下即可。ConvShader就是两个镜像函数的转换shader,不贴出来了

Material mat = new Material(Shader.Find("Hidden/ConvShader"));
var rt = RenderTexture.GetTemporary(new RenderTextureDescriptor(tex.width, tex.height, RenderTextureFormat.ARGB32));
Graphics.Blit(tex, rt, mat); var instanceTex = Instantiate(tex); instanceTex.Resize(instanceTex.width, instanceTex.height / );
instanceTex.ReadPixels(new Rect(, , instanceTex.width, instanceTex.height), , );
instanceTex.Apply();
...

主要是转换全景图的两个函数,参考了github上的内容,顺带把常量改成了内置的UNITY_PI。

float3 UvToDir(float2 uv)
{
uv *= float2(UNITY_TWO_PI, UNITY_PI); float theta = uv.y;
float phi = uv.x;
float3 dir = float3(, , ); dir.x = sin(phi) * sin(theta) * -;
dir.y = cos(theta) * -;
dir.z = cos(phi) * sin(theta) * -; return dir;
} float2 DirToUV(float3 a_coords)
{
float3 a_coords_n = normalize(a_coords); float lon = atan2(a_coords_n.z, a_coords_n.x);
float lat = acos(a_coords_n.y);
float2 sphereCoords = float2(lon, lat) * (1.0 / UNITY_PI);
return float2( - (sphereCoords.x * 0.5 - 0.5), - sphereCoords.y); //must flip x
}

转换之后就是在显示部分做修改,通过传入一个方向矢量来返回全景图的UV,并在其内部做镜像图片的修复

需注意输出x分量并非0-1区间,而是0-2,估计由于全景图宽高2:1导致的,这里简单修复了下。

而y轴接缝较为明显,通过手动调节误差。压缩,关闭mipmap等。接缝问题会得到缓解。

float2 DirToUV(float3 a_coords)
{
float3 a_coords_n = normalize(a_coords); float lon = atan2(a_coords_n.z, a_coords_n.x);
float lat = acos(a_coords_n.y);
float2 sphereCoords = float2(lon, lat) * (1.0 / UNITY_PI);
float2 uv = float2( - (sphereCoords.x * 0.5 - 0.5), - sphereCoords.y); //----------------------------
uv.x -= ; if (uv.x > 0.5)
uv.x = 0.5 - (uv.x - 0.5); uv.x *= ;
//----------------------------Mirror X. //----------------------------
uv.y *= 1.999; if (uv.y < )
uv.y *= -0.97;
else
uv.y *= 1.03;
//----------------------------Mirror Y. return uv;
}

基本如上,另外很多情况下需要Cubemap转HDRI全景图,可直接参考维基百科上的Cubemaping映射函数:

https://en.wikipedia.org/wiki/Cube_mapping

Unty中通过镜像优化HDRI全景图体积的更多相关文章

  1. 一步步搭建docker私有仓库并从私有仓库中下载镜像

    一步步搭建docker私有仓库 #下载镜像 docker pull registry#查看镜像 docker images #运行私有仓库,指定端口和数据卷 docker run -d -p : -v ...

  2. Docker私有仓库 Registry中的镜像管理

    这里主要介绍Registry v2的版本 查看Registry仓库中现有的镜像: # curl -XGET http://10.0.30.6:5000/v2/_catalog# curl -XGET ...

  3. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...

  4. Visual C++中的编译器优化

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Visual C++中的编译器优化.

  5. 使用ThinkPHP开发中MySQL性能优化的最佳21条经验

    使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...

  6. Kafka 协议实现中的内存优化

    Kafka 协议实现中的内存优化 Kafka 协议实现中的内存优化   Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response ...

  7. Lazy<T>在Entity Framework中的性能优化实践

    Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...

  8. 【原创】Webpack构建中hash的优化

    背景: SPA的vue应用,采用webpack2构建,打包入口为main.js 输出:main模块打包成app.js,公共lib打包成vendor.js,公共样式打包成app.css,运行时依赖打包成 ...

  9. Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

随机推荐

  1. C++雾中风景13:volatile解惑

    笔者入职百度时,二面面试官的让我聊聊C++之中的volatile关键词.volatile在Java和C++之中的差别可谓是天差地别,我只是简单聊了聊Java之中的volatile,面试官对我的回答并不 ...

  2. bootstrap-fileinput文件上传控件的亲身实践

    经理让我帮服务器开发人员开发一个上传文件功能界面,我就想着以前使用过bootstrap-fileinput插件进行文件上传,很不错.赶紧就撸起来了. 1.下载压缩包.插件地址https://githu ...

  3. Xamarin Essentials教程安全存储SecureStorage

    Xamarin Essentials教程安全存储SecureStorage   在实际应用中,应用程序会将一些数据保存在用户设备中,避免用户重复操作.但是为了防止因设备丢失或者感染病毒导致数据泄漏,需 ...

  4. 备份LeetCode OJ自己编写的代码

    常泡LC的朋友知道LC是不提供代码打包下载的,不像一般的OJ,可是我不备份代码就感觉不舒服- 其实我想说的是- 我自己写了抓取个人提交代码的小工具,放在GitCafe上了- 不知道大家有没有兴趣 ht ...

  5. CY7C68013 USB接口相机开发记录 - 第三天:固件修改

    上篇说了驱动怎么配置,这篇记录下对应的设备固件怎么配置.首先看下我们工程结构: 摘自官方文档AN61345 STARTUP.A51是建立工程时自动生成的文件,下面所有文件都是手动添加的.对于下面的几个 ...

  6. [P3452][POI2007]BIU-Offices (BFS)

    这里有一个很完美(搞笑但是确实是这样的)翻译 题意 神牛 LXX 昨天刚刚满 18 岁,他现在是个成熟的有为男青年.他有 N 个 MM,分别从 1 到 N 标号. 这些 MM 有些是互相认识的.现在, ...

  7. chrome浏览器下载内容存放位置

    点击: 或者直接快捷键 ctrl +J 打开下载的资料在[设置]中可将浏览器设置成默认浏览器,更换下载内容的存放位置:给一个提示,本人未曾修改下载的存放位置,是用户/Administrator/Dow ...

  8. redis:hash哈希类型的操作

    1. hash哈希类型的操作 1.1. hset key field value 语法:hset key field value 作用:把key中field域的值设为value 注:如果没有field ...

  9. 用python实现ARP欺骗

    首先介绍一个python第三方库--Scapy,这个库不是标准库,默认是没有的,需要安装,不过在kali-linux里边是默认安装的, 这里我用kali做攻击者,xp做受害者 关于Scapy Scap ...

  10. db2 load报文件系统满

    使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...