关于地形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会有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,提高了一点精度,同时占用资源不变。使用5551/565的方式是因为四个通道的和为1,有了三个通道就能算出第四个,前面的笔记里有记录。

时间: 2024-10-05 20:32:17

关于地形altas的处理的相关文章

altas mysql-proxy 配置读写分离

Altas software is a upgrade version of mysql-proxy, whose function is the same as mysql-proxy. Where can you get it ? Altas 2.2.1 RPM: https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el5.x86_64.rpm https://github.com/Qihoo360/At

真实三维地形建模

ujust4fun 整理 1.国内的地理数据信息云http://www.gscloud.cn/,国外Google earth+科学上网.下载高程DEM数据,下载卫星地形图可用于后期贴图,可以自行选择省市等区域: 2.安装global mapper 软件,3dmax软件: 3.将下载得到的img文件或者tif/tiff文件导入到global mapper中 ,configure->projection->[projection设置格式为UTM]->OK: 4.从global mapper导

Directx11学习笔记【二十二】 用高度图实现地形

本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Directx11学习笔记[十三] 实现一个简单地形),只不过原来使用一个固定的函数获得地形高度,这样跟真实的地形差距比较大.接下来让我们学习使用高度图来进行三维地形模拟. 1.高度图 高度图其实就是一组连续的数组,这个数组中的元素与地形网格中的顶点一一对应,且每一个元素都指定了地形网格的某个顶点的高度值.高度

OPENGL 地形

用OPNEGL弄了好久,终于有个地形的样子了! 看起来还是很糟糕....

关于STK地形和纹理数据

在STK中完成了第一步工作,生成了珠穆朗玛峰的地形数据,地形是基础,搭好舞台是前提,总体效果达到预期效果. 一.地形(Terrain)数据 地形数据采用的是STRM(ShuttleRadarTopographyMission)数据,下载地址http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp,下载之后格式为GeoTIFF的高程数据.该格式数据可通过Global Mapper将其转换为USGS DEM的.dem格式. 二.纹理(Image)数据 纹理

Unity学习-地形的设置(五)

添加地形游戏对象 [Hierarchy-Create-Terrain] 为了看的看清楚,在添加一个平行光 [Hierarchy-Create-Direction light] 导入地形包 [Assets-Import Package- Terrain Assets]   添加地形的纹理 可同时添加多个地形的纹理,Testures不懂的,可以看前面几篇 然后对地形进行纹理描绘 地形中添加山 几种画刷,自己试一下 要山太过了怎么办 想要山光滑点,怎么办   地形中添加树 导入树纹理 用画刷,刷树,放

超大地形的处理 (Terrain Visualization)【转自知乎】

转自顾露 [开放世界游戏中的大地图背后有哪些实现技术?] 链接:http://gulu-dev.com/post/2014-11-16-open-world ### 4. 超大地形的处理 (Terrain Visualization) 终于说到对超大地形的处理了.可以说从上世纪九十年代起,超大地形的可视化,一直是3D游戏领域热门的话题.今天我们就借着这个机会,把相关的算法和实现理一理吧. 考虑到篇幅太长的话,俺的手指头招架不住,再一个不少对这个话题感兴趣的同学可能压根就不是程序员,一些实现细节可

关于生成三维地形

本以为<OpenGL游戏编程>中的地形生成算法很高大上,但最近几天因为在看<3D地形编程>,整本书介绍的都是跟地形相关的内容,而<OpenGL游戏编程>中所述地形算法正是最简单的那种,仅仅是<3D地形编程>入门级的算法(硬渲染算法),由LOD.CLOD算法生成的地形是为了渲染大型室外场景的.<OpenGL游戏编程>这本书如今称得上是看明白了,介绍的更多的是OpenGL API和OpenGL程序机制,比较基础,纯粹是堆积木式的开发.总的来说,算法层

使用ArcGIS API for Silverlight实现地形坡度在线分析

原文:使用ArcGIS API for Silverlight实现地形坡度在线分析 苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作了.....前段时间一直比较忙,上课,考试,论文,以及联系实习单位...现在就差实习还没有着落了. 前些天帮一网友做了个在线坡度分析的例子,大概的功能就是勾选任意的地形区域,然后实现Web端的地形坡度分析和可视化显示,效果图如下: 实现的基本思路大致分为以下三部分: 1.在ArcMap中建立坡度求解