关于地形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中地形添加阴影
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
随机推荐
- Hello vue.js的随笔记录
数据双向绑定的script在组件定义位置后面才顶用. 使用它的话,引用js就好,比较简单. 声明一个vm对象,new Vue({}).这个构造里传一个对象,包含el:界面元素,data:数据,meth ...
- 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示
第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...
- 如何用ESP8266实现网页配置(web)
准备工作 准备一个深圳四博智联科技有限公司的ESP-F 模组.或者四博智联科技的NODEMCU 当我们拿到ESP-F模块后,可以按照以下接线进行测试: 即 VCC.EN 接 3.3v.GPIO15 G ...
- jQuery对象和普通DOM对象的区别
1.DOM对象DOM实际上是以面向对象方式描述的文档模型.DOM定义了表示和修改文档所需的对象.这些对象的行为和属性以及这些对象之间的关系.根据W3C DOM规范,DOM是HTML与XML的应用编程接 ...
- 预热ASP.NET MVC 的View
ASP.NET MVC 的View 预设是Load on Demand(按需加载),也就是说View 第一次要Render 的时候才会去载入跟编译,这个就会造成一个现象,即使Web 应用程式已经完成启 ...
- mysql 数据库主从同步
1.简介 写这篇文章是网上找到的相关主从同步的都不够完全,本人第一次搭建主从同步,完全看着网上的文章来搭建的,结果你懂的,踩了很多坑.所以特地把踩到的坑写出来,新手切勿直接布置到正式环境,请于测试环境 ...
- java知识点总结--java数据类型
java中的两大数据类型 1.基本数据类型:也称作内置类型,java语言本身提供的基本数据类型是其他类型(包括java核心类和用户自定义类)的基础 2.引用数据类型:java语言根据基本类型扩展数的其 ...
- 2017-9-10"切题如切菜杯"模拟赛T4 ZZI
题目 YYH拿到了父亲给的钱欣喜若狂,把这些钱拿来造了n栋房子.现在他要给这些房子通电.他有两种方法:第一种是在房间里搭核电发电机发电,对于不同的房子,他需要花不同的代价Vi:,第二种是将有电的房子i ...
- ES6 let&const
今天来总结一下ES6里面let与const的用法 先总体看一下ES6中的let都有哪些特性: let 特性 let声明的变量在js中不可以重复声明,防止变量的污染和覆盖 let声明的变量不涉及变量的提 ...
- Delphi7第三方控件
控件安装(安装时建议先关闭Delphi) 1.只有一个DCU文件的组件. DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本 ...