如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

地形绘制有重复度高,高度控制自由,贴图复杂度高且有连贯要求等特点。因此必须要使用特化的绘制方法才得以完成绘制。先前Ubisoft Far Cry 5分享的地形绘制方法,使用了QuadTree + Virtual Texture的方法。这样的方法有很多优势,因为QuadTree提交的都是固定的面片,因此从剔除到提交都完全可以在GPU做,这和我们之前实现的GPU Driven Pipeline思路相仿,而Virtual Texture可以用来表示各种Geometry信息,如高度,漫反,法线,粗糙度等等…… 因此我们也决定使用这样的技术来实现大地形的绘制和编辑。

四叉树的实现对于算法能力扎实的朋友来说,并不算难事,所以这里直接就跳过四叉树的基本算法原理,拿出部分代码示例进行讲解。因为Virtual Texture加持的原因,在构建四叉树时不需要准备诸如Material ID之类的额外信息,只需要保存当前区块的位置坐标,LOD等级(用于切换LOD),以及缓存状态(方便递归)等,数据结构也会非常简单:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

有个小细节是,为提高内存分配性能,四个子节点是同时分配的,这一点许多习惯C++高级特性的开发者很容易习惯性的漏掉,但是性能都是从这种小细节抠出来的,因此一定要注意:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

因为使用了Unity提供的手动内存分配,因此完全可以使用Burst Compiler提高CPU端计算速度:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

准备完毕后直接提交到StructuredBuffer等Compute Shader用到时拿去做剔除绘制工作,渲染结果如下(Albedo贴图为局部UV显示):

Farcry 5提到的Procedural Virtual Texture分为两部分,第一部分Procedural和Adaptive,基本占了99%的工作量,主要工作量在于各种自动化生成,手动高性能编辑的工具,以及随玩家移动进行动态加载卸载的游戏逻辑;第二部分为Virtual Texture,基本占了不到1%工作量,本着柿子先挑软的捏的精神我们先把Virtual Texture部分简单实现以下。

所谓Adaptive Virtual Texture一句话总结就是:存贴图的对象池。首先,开一张Render Texture作为Index map,存储一个Scale Offset,也就是一个指向Atlas位置的索引。同时开一张Atlas,当地形加载到这一部分时,从硬盘加载贴图到Atlas的某个部分,并将新加载的部分的位置放到Index map中,也就是说使用Index map作为一张跳表。而渲染地形时,直接把当前地形的世界坐标当做UV读取Index map即可,相当于整个地形使用了一张硕大无比的贴图,只不过这个贴图中间大部分地方都是没加载的,读取贴图的伪代码大致如下:

Texture2D<float4> _IndexMap;Texture2DArray<float4> _Atlas; SamplerState sampler_Atlas;float4 _IndexMap_TexelSize;//Indexmap 的物理大小float4 TexVT(float2 uv){//将传入UV转换到Index map的绝对坐标。    uv *= _IndexMap_TexelSize.zw;//读取Index Map,XYZW四个通道意义分别为:大小比例,横向偏移,纵向偏移,数组索引    float4 scaleOffset = _IndexMap[(uint2)uv];//获取绝对UV的小数点后部分,得到局部UV偏移    float2 localUV = frac(uv);    localUV = localUV * scaleOffset.x + scaleOffset.yz;//使用换算出的UV读取Atlas    float4 value = _Atlas.SampleLevel(sampler_Atlas, float3(localUV, scaleOffset.w), 0);    return value;}

这一点在PPT中讲的也比较清楚了:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

这样灵活的空间分配和复用方式,可以使用视锥体只加载视野内的贴图,若内存和性能充裕且玩家常有高速转动镜头的需求,也可以使用摄像机坐标来加载相机四周的贴图。

同时PPT分享中也指出,由于所有世界空间中紧挨在一起的图片在IndexMap中也是紧挨的,因此在进行LOD降级时,只需要将四块区域的图片四合一放到另一块区域即可,顺水推舟,几乎没有额外消耗。

这里我们给出一套完整的API:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

软柿子轻而易举捏完。就只剩硬柿子了。当然,由于工作量巨大,可能需要本人开发数月或数年才能搭建一套有完整工具流程的Virtual Texture,所以这里只给出一个设想性质的原型用作学习探讨用途。

从上方的实现不难看出,Virtual Texture的实现过程全部是实时投射的Render Texture,实时加载,实时卸载,实时合并,因此在设计储存的数据格式时,我们也没必要储存一整张绘制好的贴图,因为这样会导致游戏的包体完全无法控制,我们只需要提供绘制所需的“种子”即可。

此类种子一般是示例贴图,Blend Mask贴图,贴花模型等,这些种子可以大量复用,并且可以使用程序化DCC工具生成,比如这里的RT就是由多张已经准备好的贴图按顺序混合,其中每张贴图都有不同的Tiling密度:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

虽然Tilling密集,但由于使用的Mask不同且混合均匀,并没有出现明显的重复感:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

只用Mask做混合显然是不够的,诸如石子,土路,苔藓等不规则物,在生产时往往是依赖贴花实现。贴花的实现思想也比较简单粗暴,直接在面片上方构建一个正交投影矩阵,并把模型的Geometry信息“拍扁”到贴图上:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

 
贴花本身就是模型,直接渲染贴花本身

最终有贴花的贴图丰富程度更高了:

如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析

看完上述内容,你们掌握如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程之家行业资讯频道,感谢各位的阅读!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先