Unty中通过镜像优化HDRI全景图体积
全景图即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全景图体积的更多相关文章
- 一步步搭建docker私有仓库并从私有仓库中下载镜像
一步步搭建docker私有仓库 #下载镜像 docker pull registry#查看镜像 docker images #运行私有仓库,指定端口和数据卷 docker run -d -p : -v ...
- Docker私有仓库 Registry中的镜像管理
这里主要介绍Registry v2的版本 查看Registry仓库中现有的镜像: # curl -XGET http://10.0.30.6:5000/v2/_catalog# curl -XGET ...
- 浅谈iOS中的视图优化
引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...
- Visual C++中的编译器优化
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Visual C++中的编译器优化.
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...
- Kafka 协议实现中的内存优化
Kafka 协议实现中的内存优化 Kafka 协议实现中的内存优化 Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response ...
- Lazy<T>在Entity Framework中的性能优化实践
Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...
- 【原创】Webpack构建中hash的优化
背景: SPA的vue应用,采用webpack2构建,打包入口为main.js 输出:main模块打包成app.js,公共lib打包成vendor.js,公共样式打包成app.css,运行时依赖打包成 ...
- Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
随机推荐
- Windows下MySQL数据目录修改
最近在弄一个项目,需要修改windows下面的mysql的数据目录(mysql默认是存储在C盘的,这个不太好,未来一定会满了的). 我的 mysql 是安装版,版本是 5.7. 1.首先,需要知道my ...
- Codeforces.618F.Double Knapsack(构造 鸽巢原理)
题目链接 \(Description\) 给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内.你需要从这两个集合中各选一个非空子集,使它们的和相等.输出方案. \( ...
- BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)
BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...
- Java并发编程(五)-- Java内存模型补充
前面我们已经介绍了:当对象和变量存储到计算机的各个内存区域时,必然会遇到的两个问题及解决方法 共享对象的可见性-- 解决方法:使用java volatile关键字 共享对象的竞争现象 -- 解决方法: ...
- 数模转换ADC08009应用
#include <reg52.h> //头文件 #define uchar unsigned char //宏定义无符号字符型 #define uint unsigned int //宏 ...
- VS Code打造一个完美的Springboot开发环境
对于使用Springboot环境开发java应用,首选IDE还是IntelliJ IDEA(2018),当前版本已经很流畅了,现在开发用的电脑配置基本都能够很6的跑起来,IDEA用起来真心爽啊,比Ec ...
- MySQL(七)
视图 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情 解决:定义视图 视图本质就是对查询的一个封装 定义视图 create view stuscore as select students.* ...
- Java Web 域名
虽然可以直接通过IP地址来访问WWW的每一台主机,但是32位IP地址非常难记.所以,为了便于记忆,按照一定的规则给Internet上的计算机起了名字即域名.通俗地说,域名相当于一个房屋的门牌号码,别人 ...
- pycharm实现sublime的显示效果,很惊艳哦
收到https://github.com/simoncos/pycharm-monokai链接中的指引 下载箭头所指的文件,然后按照 PyCharm -> File -> Settings ...
- Django REST framework API开发
RESTful设计方法 1. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https:/ ...