关于地形altas的处理
前几天在群里跟人讨论地形atlas的问题,因为Blade也是用的4x4的atlas(16张纹理),但是大概是几年前做的,所以一些细节忘记了,在这里做下备忘。
1.atlas就是图集,图册,把多个纹理打包成一个。dx11完全可以用texture array了。mobile上还有使用的可能。下面的图来自网络,展示地形altas的分布方式
2.atlas不仅可以用于地形,比如很多小物件的mesh,放在一张贴图上,一般不像地形的纹理那么规则。这样可以共享纹理,可以用一个drawcall 画出来提高效率;或者减少texture/sampler state切换,提高效率;
3.atlas最大的问题是tiling模式的问题,因为硬件tiling不可用,需要tiling的是某个子区域,所以需要在shader里处理
4.shader里一般用frac(uv)来模拟repeat/wrap的tiling效果
5.frac()的结果是不连续的,[0,1) 而不是[0,1] 所以uv [0,1) ~ [0,1) ,会有1)~[0的跳变。 uv跳变的结果就是mipmap变成最低级别,一般退化为纯色,所以会有缝隙。 这里牵扯到mipmap的计算方法。一般硬件都是根据ddx(uv)和ddy(uv),即屏幕空间的uv变化率来计算,变化率越高说明uv的变化越快,越需要低频的低LOD优化。
解决方法:
shader model 2.0一下可以不使用mipmap,勉强绕过问题
shader model 2.x 可以用tex2Dgrad,手动传入frac之前的ddx ddy(uv),这样就不会有跳变
shader model 3.0+可以用tex2Dlod, 指定mip LOD。用frac之前的ddx,ddy自己计算mipmap
6.atlas 的bilinear bleeding问题:每个子纹理采样到边缘时,会采样到邻接的子纹理,这是bilinear bleeding导致的缝隙。shader model 2.0可以关闭bilinear filtering。
shader model 2.0+, 可以根据ddx ddy自己计算mipmap, 根据贴图原始大小比如512x512,就能得到每个mipmap的大小,比如mip1为256x256, 即能得到这个mip级别下,半个像素的uv跨度,比如mip1 256x256,半个像素的uv跨度为0.5/256.0,从而偏移半个纹理元素,对于边缘纹素,只采样其中心,这样就不会有bleeding。
7.手动模拟repeat/wrap,而且对边缘像素去掉了bilinear filtering,tiling的时候也不够自然。 所以Blade会在生成atlas的时候,会在CPU对边缘做4个像素的过渡,(4个像素一般是一个压缩纹理的一个block,边缘像素需要解压-混合-压缩)再填充到atlas
以上是atlas的原理和问题,而使用的主要目的当然是为了优化。 优化结果:
1.4x4的atlas可以支持16张贴图,比如512x512或者1024x1024的地形,通常为了合并drawcall和减少sampling state切换,都共享纹理。如果不是用atlas,通常由于纹理绑定数量的限制,加上normal map和specular map,那么共享4-7张就最多了。 也就是说一个tile只有4种纹理,使用atlas可以有16种甚至更多。 (dx11+ 当然还是texture array更方便,没有上边那些破事)
2.目前Blade有4x4的albedo,和4x4的normal map。normal map在对高的材质LOD才会有。 因为用atlas就不需要纹理状态切换,所以可以合并draw call。一个tile最多两个draw call。3x3 tile的地形,draw call 在10~13个之间。
如果加上specular,和远处雾色的低LOD,合并draw call后每个tile最多3~4个draw call, 3x3的tile,draw call大概在18左右。
合并的方式: 一个地形块(tile)内的所有block(chunk)共享同一个vertex buffer,并使用CPU(soft) index buffer,剔除后可见的block的CPU index buffer合并为一个GPU index buffer。
3.关于slpatting blend map的优化: 4通道的RGBA8,如果压缩的话,精度丢失,而且因为纹理的block compression的问题,会导致混合结果呈块状,所以一般不压缩。解决方法是使用RGBA4的blend map,精度减半但是占用内存减少一半,所以适合mobile。
其实用的是5551/565,提高了一点精度(相对于R4G4B4A4提高了一倍精度),同时占用资源不变。使用5551/565的方式是因为四个通道的和为1,有了三个通道就能算出第四个,前面的笔记里有记录。
关于地形altas的处理的更多相关文章
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- Smart3D系列教程5之 《案例实战演练2——大区域的地形三维重建》
一.前言 Wish3D出品的Smart3D系列教程中,前面一讲说明了小物件的照片三维重建,相信大家对建模的流程有了一定的了解.这次讲解中,我们将演示说明以一组无人机倾斜摄影照片为原始数据,通过Smar ...
- Cesium原理篇:3最长的一帧之地形(1)
前面我们从宏观上分析了Cesium的整体调度以及网格方面的内容,通过前两篇,读者应该可以比较清楚的明白一个Tile是怎么来的吧(如果还不明白全是我的错).接下来,在前两篇的基础上,我们着重讨论一下地形 ...
- Cesium原理篇:3最长的一帧之地形(2:高度图)
这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面. 此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...
- Cesium原理篇:3最长的一帧之地形(3:STK)
有了之前高度图的基础,再介绍STK的地形相对轻松一些.STK的地形是TIN三角网的,基于特征值,坦白说,相比STK而言,高度图属于淘汰技术,但高度图对数据的要求相对简单,而且支持实时构建网格,STK具 ...
- Cesium原理篇:3最长的一帧之地形(4:重采样)
地形部分的原理介绍的差不多了,但之前还有一个刻意忽略的地方,就是地形的重采样.通俗的讲,如果当前Tile没有地形数据的话,则会从他父类的地形数据中取它所对应的四分之一的地形数据.打个比方 ...
- arcgis基于地形数据的坡度分析
高程.坡度和坡向是小班中非常重要的因子,坡度对水土保持规划设计具有决定性的作用,是土地利用规划和治理措施配置首先要考虑的因素.如何利用地形数据对坡度进行分析呢,本文即将揭晓. 软件准备: locasp ...
- KlayGE 4.4中渲染的改进(三):高质量无限地形
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2761 本系列的上一篇讲了DR中的一些改进.本篇开始将描述这个版本加入的新功能,高质量地形 ...
- GJM : 【技术干货】给The Lab Renderer for Unity中地形添加阴影
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
随机推荐
- [git]入门-工作区、暂存区、版本库
转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256 ...
- 干货 | SSMS客户端连接京东云RDS SQL Server配置方法
干货 | SSMS客户端连接京东云RDS SQL Server配置方法 原创: 于振江 京东云开发者社区 微软SQL Server, Oracle数据库以及MySQL系列占据了关系型数据库市场的绝对 ...
- 什么是 Message Queue
Message Queue 是一种非同步的从一个服务到另一个服务的交流形式, 被用于无服务器架构和微服务架构中. Messages 被储存在一个队列中直到被处理了或被删除. 每个Messages只会被 ...
- 文件访问权限:更改用户ID
本文来探讨一下通过更改用户ID来获取合适的文件访问权限.由于更改组ID的规则与用户ID相同,我们在这里只探讨用户ID. 纸上得来终觉浅 先了解以下几个基本知识: 用户ID包括:实际用户ID.有效用户I ...
- vue axios上传文件实例
<head> <title></title> <meta charset="UTF-8"> <meta name=" ...
- 关于MySQL什么时候使用索引问题以及什么情况下应不建或少建索引
一,什么情况下使用索引1. 表的主关键字 自动建立唯一索引 2. 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 3. 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk ...
- Jenkins 随笔
window是 随笔 修改端口 : <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsService ...
- EF简单的CURD操作
/// <summary> /// EF添加数据 /// </summary> /// <param name="sender"></pa ...
- 浅谈ES6新增数据类型:Symbol
面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol JS的原始数据类型:6种Boolean,String,Undefined,NULL,Numb ...
- 利用Python进行数据处理1——学会使用NumPy
一.学会使用ndarray 1.1什么是ndarray? ndarray是NumPy中的一种多维数组对象,他可以是一维的.二维的.甚至更多维次.当然创建更多维次的数组并不是他的优点所在,他的优点在于它 ...