游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2645|回复: 0

《孤岛惊魂5》中的地形渲染技术-网格生成

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2019-12-27 11:21:54 | 显示全部楼层 |阅读模式
image002.jpg

育碧作为一个年货大厂,在PCG这方面肯定有很深的积累,在GDC2018的这次分享中,其详细的介绍了地形在纯GPU管线上的实现方式,使得最终能够得到一个拥有大片悬崖峭壁的真实地形。

本文是笔者看完FarCry5的分享后写的个人理解,初次学习GPU管线,难免有理解错误的地方,希望大佬指正

image004.jpg

本次分享依次介绍了以下内容

1.GPU Pipeline实现

2.地形渲染

3.悬崖渲染

4.高度图之外的技术

5.基于屏幕空间的渲染

6.其他地形相关

GPU Pipeline实现

首先说一下单个平面的实现

image006.jpg

先渲染一个毫无起伏的纯平面Mesh

image008.jpg

在顶点着色器中,根据InstanceID和vertexId可以得到在高度图上的对应位置,依据此位置去对顶点进行偏移

image010.jpg

配合贴图可得到以上效果

image012.jpg

之后介绍了如何将四叉树的分化逻辑移到GPU,四叉树的CPU实现已经介绍过了,这里不再细讲

https://zhuanlan.zhihu.com/p/88646346

image014.jpg

image016.jpg

按2km*2km对地形划分为多个树结构

分化到最大的地形块边长为64米,被称为一个Sector,总共有160*160个sector,也就是如果所有树分化到最大,会存在160*160个lod最大的地形块

正常游戏中会加载大概500个地形块(包含任意lod等级)

image018.jpg

正常游戏中,地形一共存在6个lod等级

每一个树结构都对应一个mipmap,mipmap的层级和lod层级相同

每一个Node的信息都保存在对应Mip等级mipmap的一个像素中

image020.jpg

像素值是一个16位的Index,根据这个index,可以去Buffer,也就是一个数组中去拿到节点的详细信息,包括高度范围,lod信息,贴图位置信息

如果这个节点是不存在的(地形不是一个标准正方形),则会把一个特殊值赋给index

四叉树是一个递归的结构,但递归难以在GPU上实现,所以这里采用该算法的循环形式

一共存在3个存储节点信息的buffer

首先把根节点放入bufferA,遍历其中每个节点

image022.jpg

如果不可分化,则将该节点加入FinalBuffer

image024.jpg

如果可分化,则将子节点放入bufferB

image026.jpg

当根节点分化完毕,会互换AB两个buffer的作用,清空BufferA,然后遍历bufferB,将子节点加入bufferA。直到处理完所有lod

image028.jpg

同时也会将每个lod的节点有多少记录下来

image030.jpg

这里还说了一个优化,但笔者没用过computershader,所以也没看懂~

image032.jpg

同时会生成一个LODMap,每个Sector都会被赋予一个LOD值,用于解决裂缝问题。

image033.jpg

image035.jpg

LOD的值能够根据FinalBuffer轻松获取

image037.jpg

每一个Node会被分为64个Patch,Patch即可视为一个具体的vertex

为16*16的Mesh,经过一系列cull,最终把可视的Patch放到一个RenderLst.

image039.jpg

image041.jpg

遮挡剔除采用的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.

image043.jpg

背面剔除,针对每一个Patch,会离线为其生成一个圆锥体,这个圆锥体Patch内所有顶点法线组成的最小圆锥。之后会把信息存到一个Tex中。

image045.jpg

运行时直接如上计算可以判断是否需要剔除

image047.jpg

每一个patch都会存储它周围节点的lod信息,如上图,当前节点lod为3,通过周围节点的lod可以得到一个值。根据此值对顶点进行干预以解决裂缝问题

image049.jpg

image051.jpg

地洞渲染的思路是地形上开两个洞,中间的管道采用单独的mesh渲染

image053.jpg

这里用到了一个小技巧,如果是洞穴口,则让坐标除0得到NaN,如果一个顶点坐标为NaN,则用到此顶点的面片都会被discard掉。

PPT下载:

链接:https://pan.baidu.com/s/1nRoaaoYI7ln0wyo6Sqppiw

提取码:4jly

相关阅读:全境封锁UI设计指南

作者:风和雨林
专栏地址:https://zhuanlan.zhihu.com/p/88859361

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-20 20:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表