前几天在群里跟人讨论地形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的处理的更多相关文章

  1. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  2. Smart3D系列教程5之 《案例实战演练2——大区域的地形三维重建》

    一.前言 Wish3D出品的Smart3D系列教程中,前面一讲说明了小物件的照片三维重建,相信大家对建模的流程有了一定的了解.这次讲解中,我们将演示说明以一组无人机倾斜摄影照片为原始数据,通过Smar ...

  3. Cesium原理篇:3最长的一帧之地形(1)

    前面我们从宏观上分析了Cesium的整体调度以及网格方面的内容,通过前两篇,读者应该可以比较清楚的明白一个Tile是怎么来的吧(如果还不明白全是我的错).接下来,在前两篇的基础上,我们着重讨论一下地形 ...

  4. Cesium原理篇:3最长的一帧之地形(2:高度图)

           这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面.        此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...

  5. Cesium原理篇:3最长的一帧之地形(3:STK)

    有了之前高度图的基础,再介绍STK的地形相对轻松一些.STK的地形是TIN三角网的,基于特征值,坦白说,相比STK而言,高度图属于淘汰技术,但高度图对数据的要求相对简单,而且支持实时构建网格,STK具 ...

  6. Cesium原理篇:3最长的一帧之地形(4:重采样)

           地形部分的原理介绍的差不多了,但之前还有一个刻意忽略的地方,就是地形的重采样.通俗的讲,如果当前Tile没有地形数据的话,则会从他父类的地形数据中取它所对应的四分之一的地形数据.打个比方 ...

  7. arcgis基于地形数据的坡度分析

    高程.坡度和坡向是小班中非常重要的因子,坡度对水土保持规划设计具有决定性的作用,是土地利用规划和治理措施配置首先要考虑的因素.如何利用地形数据对坡度进行分析呢,本文即将揭晓. 软件准备: locasp ...

  8. KlayGE 4.4中渲染的改进(三):高质量无限地形

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2761   本系列的上一篇讲了DR中的一些改进.本篇开始将描述这个版本加入的新功能,高质量地形 ...

  9. GJM : 【技术干货】给The Lab Renderer for Unity中地形添加阴影

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. CISCO 关闭4786端口解决方法

    先确认交换机是否支持smart install服务 检查命令如下: switch#show vstack config | inc Role Role:Client (SmartInstall ena ...

  2. Java的数组,集合,数据结构,算法(一)

    本人的愚见,博客是自己积累对外的输出,在学习初期或自己没有多少底料的情况下,与其总结写博客不如默默去搞自己的代码,但是学到集合这一块时,数组,集合,数据结构,算法这个概念搞的我比较混淆,所以不得已写这 ...

  3. 什么是 SaaS (Software as a Service)

    什么是SaaS (Software as a service ) 把软件作为一个服务.SaaS是一种cloud-based 和通过Internet提供软件的模式,用户不用再购买软件,而改用向提供商租用 ...

  4. 简单理解 SVM

    SVM,中文名叫支持向量机. 在深度学习出现以前,它是数据挖掘的宠儿: SVM具有十分完整的数据理论证明,但同时理论也相当复杂. 初识SVM  同其他分类算法一样,SVM分类也是寻找合适的决策边界,为 ...

  5. Fiddle手机抓包

    Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的“进出”的数据(指co ...

  6. 2017年5月12日15:10:46 rabbitmq不支持非阻塞调用服务器

    就像昨天碰到的问题描述一样,问题不是出在消费者上而是在生产者发送消息出现没有得到返回值时消息通道被挂起,rabbitmq发送的消息是阻塞调用即当发生阻塞时,继续发送的消息都堆在后面.在网上看到有两个方 ...

  7. linux之特殊字符

    特殊字符: 与路径和位置有关的特殊字符: ~  用户的家目录,超级用户为/root _  用户(-) 代表上一次用户所在路径 .代表当前目录(. 还有很多其他含义) ..代表上一级目录 通配符 *匹配 ...

  8. keras 入门整理 如何shuffle,如何使用fit_generator 整理合集

    keras入门参考网址: 中文文档教你快速建立model keras不同的模块-基本结构的简介-类似xmind整理 Keras的基本使用(1)--创建,编译,训练模型 Keras学习笔记(完结) ke ...

  9. vue项目中全局配置变量

    在项目中api管理需要用到全局变量,创建全局变量的方式也有很多. 1.通过export default const BASEURL = "http://localhost:3333/&quo ...

  10. 启动和停止SQL Server服务三种形式

    1.后台启动和停止服务 计算机>右键>管理>服务和应用>服务>sqlserver(MSSSQLSERVER) 2.配置管理器启动和停止服务 开始>所有程序>M ...