Unity 轻量级渲染管线LWRP/URP详解

Unity 可编程渲染管线, LWRP轻量级渲染管线(Light Weight Render Pipeline)出来有一段时间了, 今天写一遍文章,详细的介绍一下可编程渲染管线与LWRP轻量级渲染管线相关内容,帮助大家搞懂这些概念,并建立起一个学习可编程渲染管线/轻量级渲染管线的思维。整个文章我将会分成4个部分来个大家讲解:

(1): 什么是渲染管线与向前渲染;

(2): 什么是可编程渲染管线;

(3): 轻量级渲染管线与它的基本使用;

(4): 轻量级渲染管线Shader 模板结构;

每个Unity版本,实现的轻量级渲染管线LWRP的代码可能都不一样,但是思路原理基本都差不多。

1: 什么是渲染管线与向前渲染

我本人非常反对高大上的概念包装,唯独游戏中的"渲染"是例外之一。通俗点说渲染就是烘托出相应的环境(光照,阴影,遮挡,反射,折射等),把物体在特定的环境中绘制出来。Unity引擎里把引擎中完成整个游戏场景,人物, 环境,光照等游戏画面绘制相关,最终把画面绘制到屏幕上的整套逻辑与相关代码(普通代码与Shader代码)称为渲染管线。

Unity引擎的渲染管线主要分为"渲染核心库"与"渲染策略"两个部分, “渲染核心库”是Unity把基于OpenGL/DirectX把渲染相关的接口函数封装成API,这部分Unity引擎写好后作为核心的API渲染库。”渲染策略”指的是Unity引擎绘制整个游戏场景的时候,如何处理多相机,多光源,阴影投射,物体绘制,雾,自发光等。这个就叫做渲染策略,渲染管线基于一种渲染策略,调用渲染核心库中的API,把整个游戏场景绘制出来。

早期的Unity引擎,把整个渲染管线都内置在引擎里面,没有开放给开发者,只有少数的一些大厂,获得了Unity引擎源码授权,能修改和定制里面的渲染管线相关代码。Unity内置的渲染管线有: 向前渲染,延时渲染等,目前这两种用的比较多。Unity引擎默认使用"向前渲染"。接下来我说一下向前渲染管线中的一个渲染策略,为了后面对比轻量级渲染管线做好铺垫。向前渲染管线可以处理任意多的光源,处理多光源的时候,每个重要光源,都会调用一次Shader里面的Pass来完成渲染,有几个重要光源就会渲染几次,这样大大降低了多光源时候的绘制效率。所以之前我们很多手机游戏上面都用静态光照来渲染场景,获得逼真的光照效果,因为向前渲染管线多光源的实时计算开销实在太大。静态光照有一个问题就是无法获得实时光照的效果。

2: 什么是可编程渲染管线

前面个讲解了渲染管线与内置的先前渲染管线,我们会发现内置的渲染管线的策略有时候不满足我们的要求,比如我们需要实时光照,又需要好的性能,那么向前渲染每个光照都走一次Pass显然不合适,做手机游戏,可能只要4个光源就可以了,不用支持任意多的光源,随着unity可以开发越来越多的游戏平台,不同平台,不同类型的游戏越来越需要能修改渲染管线相关的策略,到达好的效果,同时有好的性能。Unity新版本推出了可编程渲染管线,把渲染管线里面的渲染API核心库开放给开发者,允许开发者自己定制渲染策略。Unity引擎提供了一整套可以定制渲染管线的机制,所以叫做可编程渲染管线SRP(Scriptable Render Pipeline)。

3: 轻量级渲染管线与它的基本使用

内置的渲染管线是针对通用情况,比如支持任意数目的光源等,所以很多策略并不是特定的环境下,针对特定应用场景而得到的最佳的策略,现在手机游戏非常的广泛,还有很多其它的游戏平台,需要好的渲染效果的同时,需要一个好的性能。比如我就希望有多光源的实时光照,我的角色到了光源附近能渲染出光的效果出来,而不是使用静态光照那样。同时我们又不需要任意多的光源,只要限定一个光源数目即可,比如4个。这样就可以通过定制渲染管线,提升性能,比如我们最多支持4个光源,我把所有光源的计算一起放到一个Pass里面,这样提升性能的同时,又获得实时的光照,虽然对光源的数目做了一些限制(轻量化),却获得了效果和性能的一个灵活的平衡。Unity 针对手游等应用领域,开发了轻量级渲染管线(LWRP),后来基于轻量级渲染管线又衍生出来另外一个渲染管线Universal Render Pipeline(URP,这边文章我们用的是URP的代码)。

渲染管线的渲染策略被定制了,渲染的时候需要Shader来配合最终绘制物体出来,所以不同的渲染管线Shader会不一样,我们之前学习的Shader开发都是针对向前渲染管线的,比如轻量级渲染管线所有光照计算都在一个Pass,那么之前向前渲染的Shader肯定就不能直接使用了。所以当我们定制了新的渲染管线以后,还要基于新的渲染管线的策略重新开发一个Shader包(PBR Shader, 粒子, 雾,天空盒等),这个Shader包能满足大部分的3D游戏开发的需求,同时我们也可以基于新的渲染管线的策略来开发自己的Shader。

总结一下定制渲染管线的主要的3个点:

(1) 渲染核心功能的API,由引擎开放给开发者调用;

(2) 定制渲染策略,开发者根据自己游戏的情况来定制自己的渲染管线,达到最好性能;

(3) 基于渲染管线的渲染策略,开发出对应的Shader包;

完全从头到尾定制一个渲染管线并不容易,幸运的是Unity引擎为我们做好了轻量级的渲染管线,满足我们做手机游戏的绝大部分的需求。我们只要使用就可以了,如何使用轻量级渲染管线,这里我们已URP为例:

(1) 安装URP的相关的Unity Package, 不同的Unity的版本可能URP的代码版本不一样。

(2) 使用URP渲染管线来代替内置的渲染管线。先创建一个渲染管线的Asset文件,配置好相关数据,创建成功后,在Grpahics下面的Scriptable Render Pipeline选择这个Asset文件,切换渲染管线成功。系统会根据Asset文件的描述来创建出渲染管线出来。如图:

(3) 创建角色,场景,创建材质的时候,使用渲染URP渲染管线相关的Shader;

4: 轻量级渲染管线Shader 模板结构

Unity可编程渲染管线(包括轻量级渲染管线)的Shader开发仍然使用的是ShaderLab的语法结构,开发语言和普通的Shader开发不一样,使用的是HLSL编程语言。同时有些渲染管线还支持Shader Graphic开发。作为程序员,我个人还是建议自己手写代码,比起生成的Shader的代码,手写代码能减少冗余,更高效。我们打开URP渲染管线里面 PBR Shader如下图:

仍然是基于ShaderLab, 和普通的Shader结构,没有区别。

我们来看几个重要的Pass, 体会一下和向前渲染管线的不同。先来看主要的绘制Pass,处理光照计算的,正如红线标注的一样,所有的光源在一个Pass里面计算完成。

看下阴影投射的Pass:

看下HLSL代码,和Cg差不多,所以学习的时候不用由心里负担, 打开LitForwardPass.hlsl,这个文件就是URP里面PBR Shader具体实现的代码。截图如下,数据结构这些和Cg没有太大的差别,如图:

由于篇幅有限,没有办法把Shader详细代码的讲解一遍,为此我还提供了本文对应的代码与视频讲解(里面详细讲解了Shader结构),需要的可以进入unity学习交流小组来学习教程,并获取课程源码。 URP渲染管线效果截图如下:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容