关于地形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中地形添加阴影
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
随机推荐
- react系列笔记:第一记-redux
前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...
- OO第十二次作业
规格设计的发展历史 随着计算机软硬件的发展,代码的复杂程度也在不短增加,随着计算机软件规模日渐庞大,结构化程序设计方法开始无法满足用户的需求,面向对象程序设计产生.面向对象程序设计是一场重大的革命,提 ...
- 2017年4月13日用VS写C程序遇到的一些问题
在网上找到一篇展示计算机浮点数格式的文章,且有C代码如下: #include <stdio.h> #include <stdlib.h> #include <string ...
- python笔记21-内置函数
# print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真# print(any([0,0,0,0,0]))#判断可迭代的对象里面的值是否有一个为真# print(bin(10 ...
- 机器学习环境搭建-Pycharm
刚刚开始学习机器学习,遇到了很多的问题,尤其是搭建环境让我觉得脑袋特别疼.我用的是win8 64位操作系统,硬盘小的可怜.开始我也跟着下载了anaconda,后来发现anaconda一点儿不像说的那么 ...
- 查询总耗CPU最多与平均耗CPU最多的SQL语句
总耗CPU最多的前20个SQL total_worker_time AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time AS ...
- JS-斜杠和反斜杠的转换
例子:var url = "http://localhost:64177/Home/AccordionIndex"; 将斜杠转换成反斜杠: url = url .replace(& ...
- 微信小程序(mpvue)—解决视频播放bug的一种方式
// 第一页 <div @click="play(video.src, video.width, video.height)"></div> methods ...
- python—DAY1
# user = "123"# possword = "111"# count = 0## while count < 3:# user_name = i ...
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...