图形引擎实战:HDRP移动版高清渲染管线改造

前言

近年来,随着移动平台硬件的性能不断提升,移动端游戏采用的渲染技术更加先进,整个行业对画质效果的需求也越来越大,我们借此做了一些技术尝试,测试了Unity HDRP是否可以在移动端跑起来,结果是可行的。(后来我们又升级到了2021.1.x版本,对应HDRP 11.0.0版本,以下说明都是基于这个版本的。)先看一下之前某个开发阶段录制的视频,米11上30+ fps:

 

管线预览

管线采用了Forward+和TBDS的混合管线,非常适合移动端TDDR GPU架构,对多光源支持较好,比Forward节省光照计算,又比传统的Deferred管线节省带宽;支持物理相机、HDRI Sky、面光源、体积雾、SSR、TAA等多种特性,我们对一些特性做了删减和开关,对相关计算做了优化。先看一下整个管线的大体流程:

a) Pre-Z Pass阶段,写入前向渲染的深度和法线,以及材质对应的 stencil id

b) 写入GBUFFER信息及材质对应的stencil id。固定使用四个GBUFFER缓存。

(GBuffer0 :BaseColor+SpecularOcclusion)

(GBuffer1: Normal+Roughness)

(GBuffer2: Metallic + RenderingLayer + ShadowMask0 + MaterialFlagsId)

(GBuffer3: BakeDiffuseLighting/EmissionColor)

c) Hi-z 深度图生成,用于后面的 SSR 精确快速的ray marching

d) motionvector map绘制

e) 构建灯光列表和 基于tile的材质id。依屏幕大小等分tile网格,主要构建灯光列表和更大的BigTileLightList。前者用于一般的光照访问,tile大小为32x32;后者用于Volume以及半透物体,或者其他不需要精确光照的渲染阶段,tile大小为64x64。另外,还构建了用于Cluster模式的VoxelLightList。

f) Volumetric voxelization,利用clusterbuffer的bigtile生成3d的DensityBuffer。可用于体积雾以及其他需要3D纹理的渲染效果。

在屏幕体素化到一个低分辨率的3DTexture中,生成VolumetricDensityBuffer,将场景中的local volume数据存入这3DTexture中。使用上一步生成的BigTileList计算所需光照。

g) CSM,开启主光4级级联阴影,关闭了点光、面光阴影

h) SSR &SSPR。主要分为以下两步,SSRTrace和SSRAccum。

(SSRTracing:根据之前Stencil记录,没有标记SSR的像素就直接跳过,利用屏幕深度、法线进行RayMarching)

(SSRAccum:上一步得到的HitPos用于检测相机MotionVector,用相机位移来影响最终的透明度,反射颜色本身则可以使用ColorPyrimid近似累积,根据粗糙度判断使用哪一级ColorBuffer缓存来采样,或者通过近似高斯模糊的方式做PBR累积。累积结果加入间接高光)

i) GTAO

(AOPackedData)

j) Volume Lighting, 根据BigTile的灯光List以及VolumeVoxelization生成的DensityBuffer,计算一个VolumetricLightBuffer。用于之后的折射、雾等效果。

k) Tile Deferred每种材质组合进入自己类型的CS中计算,每种类型的CS只计算指定数量的Tile,分为Tile和Cluster两种类型,优化为四种组合,涵盖点光、聚光、面光、环境光。

l) 前向forward+ 渲染。不透明物体的正常前向渲染。

m) 渲染天空

n) 计算大气散射。有雾就有散射,并支持体积雾,也支持高度分层。体积雾需要采样之前生成的VolumetricLightBuffer,并叠加雾颜色,混合到最终的ColorBuffer。

o) 计算Color Pyramid 用于折射与反射,降采样后的color 做一下高斯模糊,保证低分辨下亮度不丢失。

ColorPyramid: 6 mipLevel,大小呈2次幂递减,每一级都有高斯模糊

p) 透明物体渲染

q) 后处理渲染,移植了UE4中一些后处理做法

主要改造说明

这里主要介绍兼容性和优化方面做的一些工作

兼容性

1) 两种lightlist生成方案,针对不同硬件采用不同算法。这部分主要是针对Adreno GPU与Mali GPU来做的,两种硬件在UBO/SSBO数量、线程localmemory等方面都不同,差别较大,对于复杂的数据和计算在compute shader产生了一些兼容性问题。我们通过大量测试,合并存储计算结果的SSBO,发现Mali GPU更适合Cluster算法,Adreno GPU更适合FPTL算法

2) rt格式修改,移动端遇到了一些效果bug,后来发现是和格式有关,有些是手机兼容性不好,有些是手机不支持。比如:修改RG16为RGB16(RG16真机支持不好)、R16G16_UNorm改用R16G16B16_SFloat、B10G11R11_UFloatPack32改用rgba16、hdr采用rgba16(默认b10g11r11真机兼容性不好)等等

3) 浮点格式修改,主要是针对手机端浮点精度导致的效果错误或格式兼容性报错等

4) 反射球贴图使用普通2dTextureArray(手机端不支持cubemap array),各个probe的贴图依次列到TextureArray的各个slice上

优化

1) 调整GBuffer。原本GBuffer在不同的材质特性Standard/SSS/Anisotropic/Irridescence下存储的内容有所不同。这里只留下standard模式,其余分支都去掉。

2) 在管线的GBUFFER阶段将材质id写入模板缓冲区,在构建灯光列表阶段对不同材质的屏幕tile进行分类。渲染阶段对不同的分类进行针对性的渲染,固定几种组合,对光照计算的各个分支做了部分删减,减少shader编译过程

3) Bindless优化,UBO和SSBO。将一些光照数据从SSBO放入UBO,如DirectionLightData,shadowData。从全局buffer访问到快速访问的内存访问,速度会有所提升。其次,原本使用Texture的地方尽可能用TextureArray代替,比如ReflectionProbe改为预烘焙,在游戏启动时做一次合并到TextureArray。最多支持16个probe,存储的是2d展开的cube。

4) 引入FSR,为了减轻移动端延迟渲染对硬件产生的压力,进一步提升帧率,减少带宽压力和发热功耗,而不过度损失游戏效果,使用AMD的FidelityFX Super Resolution 技术提升画面在低分辨率下的质量。

5) CSM分帧更新,采用了四级级联阴影,分帧更新,第一级每帧更新,其他级隔帧更新

6) 增加缓存以替代实时计算。

PrepareLightsForGPU当中收集准备灯光、阴影、Probe数据。这里可以做一些缓存,启动时只进行一次,避免每帧都去直接收集数据,可以减少一些CPU端的消耗。而如果需要开启TOD,灯光数据LightData的获取则可以分帧来获取

7) 增加遮挡剔除方案。Unity自带的Occlusion Culling在运行时消耗大量CPU时间且不支持动态加载与卸载PVS数据。加入一个针对prefab对象的Occlusion系统,做为遮挡体的Occluder初始完全加载,被遮挡体的Occludee随Prefab动态加载。利用CullingGroup做裁剪

8) 增加灯光剔除,按layer分类,根据相机距离缩减各类灯光的Range比例

9) 扩展添加了给平面反射使用的SSPR,减少SSR中raymatching计算面积,效率更高(场景中大量的使用的是平面反射)SSPR使用模板缓冲区标记屏幕内平面反射区域)

10) 关闭RayTrace、简化PBR光照Feature、删除不必要的计算、限制单个tile灯光数量等等

小结

HDRP管线偏重度一些,集成了多种渲染技术,通过对HDRP管线的移动端改造,我们验证了一些技术方案的可行性,积累了相关经验,并推广到了项目中应用。

欢迎加入我们!

感兴趣的同学可以在官网投递简历:

内推码:NTAI1kh

引擎校招:搜狐畅游 - 校园招聘

引擎实习:搜狐畅游 - 校园招聘

TA校招:搜狐畅游 - 校园招聘

TA实习:搜狐畅游 - 校园招聘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41709.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE 实时地形高度检测(二)。利用Niagara及虚拟纹理(virtualTexture)生成动态——立体的热力图。

接上文,利用Niagara 粒子的特性,来动态生成三维热力图,高程图! 传统的平面热力图已经很清晰的表达出热力的效果了。 但是,在三维引擎中,看起来没有那么的炫酷,那就增加第三个维度Z轴&#xff…

3D-echarts的背景和地图表面的贴图

1.设置背景图片 效果如下: 核心代码(全部代码见文末): 注意:图片的路径设置 绝对路径 或 asset下面的相对路径都没有效果,要把图片放到public路径下面才有效果(此demo是写在v2脚手架中&#xf…

Unity中画2D图表(1)——用XChart包绘制折线图

做一些数据处理和数据分析的时候,把数据可视化是一项重要的工作,本例以画一个包含两条温度曲线的图开始… 一、折线图的绘制效果 二、用到的包 1、XChart介绍 2、XChart官方链接 https://github.com/XCharts-Team/XCharts 三、如何用代码来设置线条…

[计算机图形学]渲染管线,纹理映射(前瞻预习/复习回顾)

一、渲染管线 目前为止,我们前几篇的介绍当中已经把一个3D场景转换到2D的过程几乎讲完了,而这么一个过程就被称为Real-time Rendering Pipeline也就是实时渲染管线,也就是一个流水线。其中包括顶点的变换,光栅化,片元操…

Unity 之图形渲染(一)

备注:希望和大家一起交流学习,如果有不同的观点欢迎一起讨论学习,不喜勿喷,谢谢。 unity图形渲染 前提MeshMesh FilterMesh Renderer基本属性 Skinned Mesh Renderer基本属性 前提 unity 中图形渲染组件主要有三种: …

在Unity中制作逼真的建筑场景

原创 Unity Unity官方平台 2018-07-28 在创作游戏中,场景的制作是必须要面对的问题,如何高效制作好感染力强、让人印象深刻的场景是每个开发者都会面临的难题,因为场景的细节和逼真度处理起来并不简单。 本篇文章中,游戏开发工程…

【项目展示】Unity 海洋场景渲染(Boat Attack Water、光谱渲染)

项目背景 前几个月开始做的项目,需要一个使用海洋场景。但是因为项目很急,所以海水需要使用别人已经写好的开源代码。当时就想起了Unity曾经有一个URP宣传片中的海水似乎还不错,于是便基于此项目的海水进行修改(Unity在GitHub上有…

渲染的艺术:建筑效果图渲染的5个成功要素

在数字建筑可视化的早期,建筑物只是简单地填充了与不同活动和规模相对应的人体剪裁。现在,随着图像编辑软件的进步,创建建筑渲染不仅仅涉及对建筑物进行 3D 建模然后对其进行抛光。艺术家们正在探索创造性的途径,在一个框架中讲述…

Unity接入ChartAndGraph图表插件

Unity中接入ChartAndGraph图表插件 说明一、实现柱状图二、实现折线图 遇到的问题 说明 最近项目上需要实现部分图表数据显示,因为需要用到一些3D图表,所以选择了ChartAndGraph这款图表插件,图表数据是通过后台接口读取Json并解析,然后调用图…

【Unity】Unity插件:地形编辑器MTE(Mesh Terrain Editor)

文章目录 地形编辑器MTE下载方式文档及教程主要功能地表类型创建工具示例文件创建地图绘制地图快捷键提升、降低高度绘制高度平滑高度绘制纹理 细节问题处理 地形编辑器MTE MTE(Mesh Terrain Editor)是一款Unity的地形编辑器插件,该插件能够…

unity基础开发----NGUI图集Atlas制作简介

此教程属于 NGUI 的具体操作,主要描述怎么制作一个游戏中的 UI ,相对来说比较简单,熟能生巧哇,动手操作一遍就可以完全掌握的。 1 ,在 PS 里面设计好要做的 UI ,然后切片成很多个 png 的图片(这…

图形渲染技术分享:《GTA V 》图形分析摘要

环境渲染 最外层的 cubemap 是每一帧实时生成的,目的是简化后续真实反射的渲染。这个 cubemap 是一张低精度的 128*128 纹理,每个面 30 左右 drawcall,都是地表天空等较大像素贡献的多边形全部是静态物体,所以车辆的外壳反射不…

GaussDB火焰图分析

目录 问题描述问题现象告警业务影响原因分析处理方法 问题描述 CPU利用率是衡量系统负载和健康度的重要指标之一,系统在运行过程中时常发生CPU利用率高的情况。在分析性能问题时,可通过火焰图查看CPU耗时,了解瓶颈在哪里。 问题现象 部分s…

3.15 数据库吐槽大会

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 大家好,我是一名狂热的数据库程序员,趁着 3.15 的良辰吉日,鼓起勇气站上了数据库吐槽大会舞台,以下故事纯属虚构,如有雷同,请对号入座。 名不副实的数据…

一个月涨粉翻倍,摄影博主慌了:照片都是假的,肖像根本不是人

白交 发自 凹非寺量子位 | 公众号 QbitAI 一个月内涨粉翻倍,摄影博主却慌了,忍不住坦白: 我的照片都是AI生成的。 去年十月份开始,这个名叫Jos Avery的大哥(后面简称乔大哥)开始在社交网络上发照片&#xf…

百度文心一言正式亮相

OpenAI 刚发布了 GPT-4,百度预热已久的人工智能生成式对话产品也终于亮相了。昨天下午,文心一言 (ERNIE Bot)—— 百度全新一代知识增强大语言模型、文心大模型家族的新成员,正式在百度总部 “挥手点江山” 会议室里发布。 发布会一开场&…

LangChain大型语言模型(LLM)应用开发(三):Chains

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

chatgpt赋能python:用Python绘制散点图并标注各点名称

用Python绘制散点图并标注各点名称 在数据分析或机器学习中,散点图是一种常见的可视化方法。Python中的matplotlib库可以用来绘制各种类型的图表,包括散点图。然而,在散点图中标注每个点的名称是非常有用的,这可以帮助理解和解释…

类模板函数模板从属类型

准备看个项目找实习&#xff0c;边看边学&#xff0c;一看到处都是template 和typename&#xff0c;好几年前学的C都忘记光了&#xff0c;在这里先做个笔记复习一下。 template <class T> T abs(T x) {if(x < 0) return -x;return x; } int main() {int x 1;cout <…

jsonpath 语法介绍

文章目录 前言 一、对jsonpath的理解 二、补充 三、哪里可以用的到呢&#xff1f; 总结 前言 在使用Python做接口测试中需要获取json中的字段值&#xff0c;因此需要使用jsonpath里面的提取规则&#xff0c;所以特意学习了jsonpath中的语法。 一、对jsonpath的理解 在线运…