游戏开发论坛

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

《地平线:西部禁域》的Deferred Texture技术

[复制链接]

1148

主题

1148

帖子

2944

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2944
发表于 2022-5-13 10:50:48 | 显示全部楼层 |阅读模式
//导语:《地平线:西部禁域》是Guerrilla Games在2022年推出的一款备受关注的续作游戏,在游戏当中主角埃洛伊踏上了前往西方未知土地的冒险,为了实现广阔世界的种种表现效果,研发团队对其渲染管线进行了升级优化,其中就包括了Deferred Texture技术。本文内容源于在GDC 2022上Guerrilla Games团队所做的分享,原题为Adventures with Deferred Texturing in 'Horizon Forbidden West' 。

微信图片_20220513103722.png

overview

微信图片_20220513103735.png

#01关于visibility buffer

visibility buffer其实出来很长时间了,近期通过nanite被大家熟知。它有很多变种,如文章中所列,Intel(原版)、Dawn Engine(Eidos)、UE5、Activision都有不同的做法。

总的说来就是开始渲染是一个比传统gbuffer小的多的visibility buffer,仅保存primitive id等少量信息,贴图等一概不读。然后再来一个pass,把各种复杂信息补上,输出gbuffer或者直接shading都可以。这个shading过程常常是在compute shader里做的。

传统渲染管线的问题

我们以最标准的vs-rasterize-ps流程来看,这里有若干问题:

•ps总是以2x2 quad来渲染,对于tiny triangle的case,overhead非常高。

•渲染管线非常的“死”,导致很多时候出现大量gap,比如做shadow depth pass的时候,gpu中大量单元非常空闲;老的流程在面临现在更加复杂的case,真的是越来越不给力了。

• async compute等需要进一步挖掘来提升gpu利用率。

visibility buffer的优势

• 实际shading更少的pixel。

• 可以各种batch,大幅度提升cache效率。

• 可以使用compute shader,async compute,进一步提升gpu的利用率。

#02Guerrilla Games的做法

overview亮点

•用于植被,相比很多visibility buffer做法用于static mesh,这里是多了一个进步。

•使用IndirectDispatch来进一步做了batch,大幅度提升了wave的利用率。

• 融合了自己实现的VRS(不是使用硬件的)。

• 完整的管线介绍,和足够有说服力的性能提升。

植被

首先guerrilla在horizon里是把visibility buffer用于植被的。

微信图片_20220513103741.png

因为植被是一直动的,而且风动动画也一直比较消耗,所以在整个过程中带来挑战:降低vertex transform就格外的重要。

•技术细节

visibility buffer的格式:

微信图片_20220513103744.png

存的是一个32bit的信息,相比ue和activision的都更小。

pipeline & batch

batch

微信图片_20220513103748.png

如果我们建好visibility buffer,然后一个compute shader上去算,那么就会出现大量的divergence,导致性能很差。

这里使用一个DispatchIndirect,先对visibility buffer的内容进行排序,pack到16x16的tile中,然后在发起wave cmd。

这样的话,shader、texture、const的切换就大大降低,效率提升了不少。

vertex transform

这里visibility一种做法就是在shading pixel的时候,直接做vertex的transform。

这个如果triangle特别小的话,也可以是一个选项。

但是horizon的case是,triangle往往还比较大的,那么就还是batc起来比较好。

就是把要transform的vertex输出到一个ring buffer里,batch&去重,然后计算好了之后再使用。

pipeline

微信图片_20220513103753.png

整个过程拆得比较细,用到的时候再查就好,道理就是如此。

微信图片_20220513103808.png

在pipeline中间可以看到,基本都用async compute把计算给hide起来了。

• 性能

微信图片_20220513103814.png
微信图片_20220513103817.png

可以看到在这个管线里,性能提升还是很可观的。

文/安柏霖
来源:腾讯游戏学堂
原文:https://mp.weixin.qq.com/s/HuV5swIGWgXQes63zABmyg


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

本版积分规则

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

GMT+8, 2024-12-22 14:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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