《孤岛惊魂5》游戏中的地形渲染技术-网格生成
育碧作为一个年货大厂,在PCG这方面肯定有很深的积累,在GDC2018的这次分享中,其详细的介绍了地形在纯GPU管线上的实现方式,使得最终能够得到一个拥有大片悬崖峭壁的真实地形。
本文是笔者看完FarCry5的分享后写的个人理解,初次学习GPU管线,难免有理解错误的地方,希望大佬指正
本次分享依次介绍了以下内容
1.GPU Pipeline实现
2.地形渲染
3.悬崖渲染
4.高度图之外的技术
5.基于屏幕空间的渲染
6.其他地形相关
GPU Pipeline实现
首先说一下单个平面的实现
先渲染一个毫无起伏的纯平面Mesh
在顶点着色器中,根据InstanceID和vertexId可以得到在高度图上的对应位置,依据此位置去对顶点进行偏移
配合贴图可得到以上效果
之后介绍了如何将四叉树的分化逻辑移到GPU,四叉树的CPU实现已经介绍过了,这里不再细讲
https://zhuanlan.zhihu.com/p/88646346
按2km*2km对地形划分为多个树结构
分化到最大的地形块边长为64米,被称为一个Sector,总共有160*160个sector,也就是如果所有树分化到最大,会存在160*160个lod最大的地形块
正常游戏中会加载大概500个地形块(包含任意lod等级)
正常游戏中,地形一共存在6个lod等级
每一个树结构都对应一个mipmap,mipmap的层级和lod层级相同
每一个Node的信息都保存在对应Mip等级mipmap的一个像素中
像素值是一个16位的Index,根据这个index,可以去Buffer,也就是一个数组中去拿到节点的详细信息,包括高度范围,lod信息,贴图位置信息
如果这个节点是不存在的(地形不是一个标准正方形),则会把一个特殊值赋给index
四叉树是一个递归的结构,但递归难以在GPU上实现,所以这里采用该算法的循环形式
一共存在3个存储节点信息的buffer
首先把根节点放入bufferA,遍历其中每个节点
如果不可分化,则将该节点加入FinalBuffer
如果可分化,则将子节点放入bufferB
当根节点分化完毕,会互换AB两个buffer的作用,清空BufferA,然后遍历bufferB,将子节点加入bufferA。直到处理完所有lod
同时也会将每个lod的节点有多少记录下来
这里还说了一个优化买游戏账号平台,但笔者没用过computershader,所以也没看懂~
同时会生成一个LODMap,每个Sector都会被赋予一个LOD值,用于解决裂缝问题。
LOD的值能够根据FinalBuffer轻松获取
每一个Node会被分为64个Patch,Patch即可视为一个具体的vertex
为16*16的Mesh,经过一系列cull,最终把可视的Patch放到一个RenderLst.
遮挡剔除采用的Hiz,主机上会采用纯Gpu实现,Hiz的算法知乎上有很多文章,之后有时间我也会按自己的理解写一下。
而PC则会把CPU上产生的深度图上传到GPU(这里我的理解是cpu上有剔除逻辑,会把中间生成的深度图传至gpu进一步剔除,但是ppt没讲为什么这么搞)
On console platforms we use a GPU best occluder pass to prime the depth buffer and extracttheHTile.
On PC we have a software rasterized occlusion buffer that we already use for CPU visibility which we upload to atexture.
背面剔除,针对每一个Patch,会离线为其生成一个圆锥体,这个圆锥体Patch内所有顶点法线组成的最小圆锥。之后会把信息存到一个Tex中。
运行时直接如上计算可以判断是否需要剔除
每一个patch都会存储它周围节点的lod信息,如上图,当前节点lod为3,通过周围节点的lod可以得到一个值。根据此值对顶点进行干预以解决裂缝问题
地洞渲染的思路是地形上开两个洞,中间的管道采用单独的mesh渲染
这里用到了一个小技巧,如果是洞穴口,则让坐标除0得到NaN,如果一个顶点坐标为NaN,则用到此顶点的面片都会被discard掉。
《孤岛惊魂5》游戏中的地形渲染技术-网格生成相关推荐
- 游戏中的角色渲染技术之皮肤篇
原文链接https://blog.uwa4d.com/archives/Usparkle_Skin.html 这是侑虎科技第253篇原创文章,感谢作者洛城供稿,欢迎转发分享,未经作者授权请勿转载.当然 ...
- 小程序[渲染层网络层错误] failed to load image_游戏中水的渲染技术
水的渲染一直是图形学需要解决的问题,本篇博客主要介绍用傅里叶变换算法实现的水反射,也是一种假反射效果,目的是优化效率.实现的效果如下图所示: 使用傅里叶系数来表示地形高度的假反射效果,在我们开发的游戏 ...
- Games104笔记---LE6--渲染系统3:游戏中的地形/天空/云渲染
目录 地形几何 高度图: 自适应网格细分 几个原则: 网格细分的方法: 实时变形的地形: 体素化: Marching Cubes算法: 地形着色: 存储内容: 地形纹理采样: 正确的过渡算法: 凹凸/ ...
- 游戏中的实时光线追踪技术与技巧
提到游戏使用的实时渲染,很多人都会觉得光栅化渲染是唯一的方法,而想要在游戏中使用实时的光线追踪,似乎还是遥远的梦想. 虽然整体的光线追踪实时渲染架构以及相关硬件还在试验阶段,但从2016GDC的技术展 ...
- 游戏中的抗锯齿技术Anti-Alasing提炼总结
游戏中的抗锯齿技术Anti-Alasing提炼总结 锯齿(走样,失真)产生的根本原因 图形学的根本过程是一个图形转化成图像的过程,该过程是一个连续信号经过采样转化成离散信号(显示设备的像素是离散的)的 ...
- 游戏中应用强化学习技术,目的就是要打败人类玩家?
来源:AI前线 作者:凌敏 采访嘉宾:黄鸿波 2016 年,DeepMind 公司开发的 AlphaGo 4:1 大胜韩国著名棋手李世石,成为第一个战胜围棋世界冠军的人工智能机器人,一时风头无两.Al ...
- 网易游戏人工智能实验室分享:游戏中应用的AI技术
在2019网易游戏开发者峰会上,网易游戏人工智能实验室技术总监Weldon Zhang,分享了人工智能实验室在游戏AI上的探索和成果,对游戏中应用的AI技术进行了盘点. 总体来看,AI技术可以在游戏中 ...
- LOD地形渲染技术概述
参考文章 http://blog.sina.com.cn/s/blog_5e3213f30100zxet.html LOD技术简述 http://blog.sina.com.cn/s/blog_458 ...
- 游戏中的影子制作技术
本文版权归 17173 所有,如有转载请按如下方式显示标明原文出处,以示尊重! 原创:17173 原文:http://job.17173.com/content/2009-07-30/20090730 ...
最新文章
- SQL repeat()函数
- seq2seq和Transformer
- Cygwin,Nutch安装配置,检验是否正确(对网友守望者博客的修改---在此感谢守望者)2
- SQL Server遍历表中记录的2种方法
- [Java基础]Lambda表达式练习
- [js] axios拦截器原理是什么?
- 推荐算法--利用用户标签数据(04)
- layui时间日期控件使用
- python处理json数据 乱码报错_python json.loads json.dumps(ensure_ascii = False) 汉字乱码问题解决...
- 蓝牙扫描_无线扫描枪常见的传输模式及其区别
- 解决mysql锁表终极方法
- python爬虫基本原理_Python爬虫【一】爬虫的基本原理
- openstack: No valid host was found. There are not enough hosts available
- linux grep查找指定文件或目录下文件的字符
- linux系统小米球(ngrok)实现内网穿透
- Firefox Pale Moon此连接是不受信任的、无效的安全证书解决办法
- 【R语言】常用基本函数
- 刘雨昕成为Swisse斯维诗胶原蛋白系列代言人
- curl -u “username“ https://api.github.com 转换http请求
- 【机器学习】信息论基础(联合熵、条件熵、交叉熵、KL散度等)+ Python代码实现
热门文章
- 计算机二级通app打不开,计算机二级通app
- java文本区显示在右边_怎么让文本区从右边开始显示文本
- 通过doi可以检索到文献_怎么查看中外文献的期号和卷号?
- matlab根据成绩划分等级_学生成绩分等级:ABCD,分优秀 良好合格 不及格,一组公式即可解决...
- 多线程相关-ThreadPoolExecutor
- 适配移动端的文字超出隐藏并添加省略号
- [Linux] Vmware 15安装CentOs后显示网络不可用
- 使用XmlReader读Xml
- filebeat相关registry文件内容解析
- 32位汇编第七讲,混合编程,内联汇编