游戏开发中地形是一个绕不开的主题。一种地形方案是地表纹理是一张由美术生成好的大图,这种方式的好处是地形的每一处看起来都不会重复,但当地形变的非常大时,纹理图也会变的更大,一张10kx10k的地图,如果按一厘米每个像素的分辨率,需要的贴图大小将达到10个G,在目前的PC游戏中,这个大小的磁盘空间也许可以接受,但要将这么大的贴图加载到内存还是不太现实的,这时就需要合理的技术来加载需要的纹理,虚拟纹理技术(Virtual Texture)正是可以解决这个问题,其主要思想是假设地形的拥有是一张非常的大的纹理,但纹理坐标对应的是另一块比较的物理纹理上的颜色值。如下图,左边是非常大的虚拟纹理,右边是实际用到的物理纹理,我们将大的纹理切割成一个个小的Tile,将在形当前位置能够看到的纹理按不同miplevel填充到物理纹理中, 当用实际纹理的uv去采样时,实际采样的物理纹理中的一个纹理Tile。

那么如何得到这些纹理Tile呢? 首先要为大的纹理生成mipmap,如一张64x64的纹理分别生成32x32、16x16、8x8、4x4、2x2、1x1的mipmap纹理,然后将些纹理切割成2nx2n、2n/2x2n/2、2n/4x2n/4... 2n/nx2n/n、20x20数量的块,如64x64大小的纹理,切割成4x4、2x2、1x1大小的块,不能再切割level的mipmap则使用1x1。

现在这些纹理Tile有了,要解决的是地形Mesh如何使用这些Tile,我们同样将地形分割成大小相同的格子,然后将这些格子按四叉树的方式存储,如下图红框中分别为四叉树不同层的结点,四叉树的根节点存储的是最外层红框Chunk,叶子结点存储的是内层红框Chunk信息,由内到外不同层的Chunk分别对应纹理不同miplevel的相同大小的tile块,这样,就可以将这些用到的tile块绘制到物理纹理的tile中。

现在还有一个问题,那就是如何计算虚拟纹理到物理纹理的映射。这里可以用一张间接纹理来存储这种关系。下图中间那图即这张间接纹理,它的每个像素对应了地形的每一块,即将地形分成了NxN块,那么间接纹理的大小就是NxN,在间接纹理中,一个像素的RG存储了当前虚拟纹理uv对应在物理纹理中的Tile所在的位置,B存储了当前miplevel级别,A存储一些调试信息。

利用间接纹理中储存的信息,可以计算出物理纹理中的所在的uv值,伪代码如下:
1 IndirectUV = floor(uv * IndirectSize) / IndirectSize;
2 Info = texture2D(IndirectTexture, IndirectUV) * 255;
3 InTileOffset = frac(uv * exp2(MaxMipLevel – info.b));
4 PhysicsUV = (Info.rg + inTileOffset) / PhysicsTileCountXY;
代码中输入值为虚拟纹理中uv,第1行计算出在间接纹理中的IndirectUV值,第2行采样间接纹理,取到物理Tile中的偏移值和MipLevel,第3行计算在Tile块内的偏移,从上图左图中可以看到,当大的Chunk块uv值在相同物理Tile中计算uv时,需要根据MipLevel进行缩放,第4行代码加上了Tile块的偏移,并计算最终物理纹理中采样的PhysicsUV值。
上面讲到的地形方案中,纹理是预先生成好的,其缺点已经说过,当地形变的很大时,资源量是非常大的,另一种常用地形方案是基于Splat图进行混合的方案。这种方案用每四张splat小图一张controll图的方式进行混合,最终生成丰富的地形表面。



上面的地形就是用中间的controll图对下面splat图进行混合等到的效果,因为这些splat图非常小,并且可以复用,因此这种方案的优点是内存和包体空间占用比较小。但这种方案缺点是纹理采样阶段需要采样的纹理是会变的很多,用八张splat图生成的混合方案最基础的需要2张controll图+8张splat图+8张normal图 = 18次采样,如果加上detail图,采样次数会更多。这时我们以运行时将这些纹理图的采样结果渲染张到两张RT上,一张albedo图和一张normal图,这样我们在每次采样时,只需要对这两个图采样就可以了。同样这里用到了上面提到的虚拟纹理技术,这里称为Procedure Virtual Texture或Runtime Virtual Texture,只是物理纹理中的Tile块不再是从磁盘中读取,而是运行时动态生成的。为了避免一帧内执行大量bake渲染操作,这里可以将bake操作分配到多帧中,同时限制一帧最多bake请求数量,以达到稳定的帧率。
在实际应用中,还需要考虑Texture Filter问题,还有当地形变的很大时,Adaptive Virtual Texture技术又将虚拟纹理(这里实际是Indirect纹理)生成不同mipmap大小的纹理以减少和内存占用,详细见参考文献。
参考文献:
https://www.bilibili.com/video/av94157267/?vd_source=7583580bcd0cfe490c646c570643fc3b
http://mrelusive.com/publications/papers/Software-Virtual-Textures.pdf
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我这个模型:classBunny每当我提交一个表单来创建这个模型时,我都会收到以下错误:#的未定义方法“number_before_type_cast” 最佳答案 我通过将此方法添加到我的Bunny模型中解决了这个问题:defnumber_before_type_castnumberend我不喜欢它,但我想在有人发布更好的解决方案之前它会起作用。 关于ruby-on-rails-Rails验证虚拟属性,我们在StackOverflow上找到一个类似的问题: h
我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、
文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据