未来,URP管线将取代内置渲染管线,成为Unity中的默认渲染管线。Unity历经几年的专注开发,URP技术现已十分可靠,可以投入生产。
本教程介绍了内置渲染管线到URP管线的迁移,使用具体案例结合具体代码,详细分析如何在具体URP管线的项目中做渲染,从光照到阴影(通过修改源码来支持多光源阴影),再到后处理。渲染案例分析之后又深入性能优化部分详细介绍SRP Batcher、GPU Instancing如何在具体项目中做优化以及它们是如何给项目带来性能提升的。
- 可编程渲染管线概念
- 探究SRP Batcher(生效,失效条件以及性能优化)
- URP 和 内置渲染管线的光照
- URP管线下的效果实现(使用Renderer Feature)
- URP管线下的GPU Instancing(生效,失效条件以及和SRP Batcher的关系)
作者于洋,Unity技术专家、引擎组组长。曾就职于人人网、Kabam、竞技世界。从事游戏开发十余年,经历了从Flash到Unity的游戏开发过程,长期从事游戏渲染和性能优化相关工作,对PBR、云、雾、地形、URP管线等有深入研究,曾参与过《Legacy of Zeus》、《荒岛求生》、《mythwar puzzle》等游戏的渲染和性能优化工作,乐于分享渲染和优化的相关技术。
目录
1|可编程渲染管线简介
2|如何将Built-in管线升级为URP管线
3|探究SRP Batcher
4|URP和内置渲染管线的光照
5|URP管线下的效果实现
6|URP管线下使用GPU Instancing(附demo下载)
本篇转载自《URP管线全解析》的第1节。
1|可编程渲染管线简介
1.1 SRP是什么?
Unity的渲染管线可以分为Built-in内置渲染管线和SRP可编程渲染管线,其中SRP可编程渲染管线又可分为HDRP和URP,如下图所示(图片来自网络):
SRP全称为Scriptable Render Pipeline(即可编程渲染管线/脚本化渲染管线),是Unity提供的新渲染系统,是可以在Unity通过C#脚本调用一系列API配置和执行渲染命令的方式来实现的渲染流程,SRP将这些命令传递给Unity底层图形体系结构,然后再将指令发送给图形API。
简单来说,就是我们可以用SRP的API来创建自定义的渲染管线,用来调整渲染流程或修改或增加功能。
它主要把渲染管线拆分成二层:一层是比较底层的渲染API层,像OpenGL,D3D等相关的都封装起来;另一层是渲染管线上层,上层代码使用C#来编写。在C#这层不需要关注底层在不同平台上渲染API的差别,也不需要关注具体如何做一个DrawCall。
1.2 HDRP是什么?
它的全称为High Definition Render Pipeline(高清晰度渲染管线),是Unity官方基于SRP提供的模板,更多是针对高端设备,如游戏主机和高端台式机,同时更关注于真实感图形和渲染。
该管线仅与以下平台兼容:
- Windows和Windows Store,带有DirectX 11或DirectX 12和Shader Model 5.0
- 现代游戏机(Sony PS4和Microsoft Xbox One)
- 使用金属图形的MacOS(最低版本10.13)
- 具有Vulkan的Linux和Windows平台
1.3 URP是什么?
它的全称为Universal Render Pipeline(通用渲染管线),也是Unity官方基于SRP提供的模板,它的前身是LWRP(Lightweight RP即轻量级渲染管线),在2019.3版本开始改名为URP,它涵盖了范围广泛的不同平台,是针对跨平台开发而构建的,性能比内置管线要好,另外可以进行自定义、实现不同风格的渲染,通用渲染管线未来将成为在Unity中进行渲染的基础 。
平台范围:可以在Unity当前支持的任何平台上使用。
以上基本梳理了一些基本概念。
1.4 为什么诞生SRP?
内置渲染管线的缺陷
定制性差:Unity的内置渲染管线,渲染管线全部写在引擎的源码里。大家基本上不能改动,当然大部分开发者是不会去改源码,所以过去的管线对开发者来说,很难进行定制。想要有特殊订制的Unity引擎,需要高额跟Unity购买服务,Unity的工作人员会按照客户的需求去修改管线,为客户量身定做一款引擎。
研究过Unity源代码的同学应该会知道,其代码极其臃肿,效果效率无法做到最佳:内置渲染管线在一个渲染管线里面支持所有的平台,包括非常高端的PC平台,也包括非常低端的平台,很老的手机也要支持,所以代码越来越臃肿,很难做到使效率和效果都做到最佳。
为了解决仅有一个默认渲染管线,造成的可配置型、可发现性、灵活性等问题。决定在C++端保留一个非常小的渲染内核,让C#端可以通过API暴露出更多的选择性,也就是说,Unity会提供一系列的C# API以及内置渲染管线的C#实现;这样一来,一方面可以保证C++端的代码都能严格通过各种白盒测试,另一方面C#端代码就可以在实际项目中调整。(摘自网络)
以上就是《URP管线全解析》的第1节,此篇文章比较适合从事游戏开发的Unity客户端开发人员、希望提升渲染和性能优化能力的人以及对可编程渲染管线感兴趣的读者。
读完全篇后你会深入了解URP管线的具体案例实操以及性能优化相关分析;并掌握如何将内置管线提升为可编程渲染管线;如何在URP管线中做光照以及通过修改源码来支持多光源阴影及如何使用SRP Batcher以及 GPU Instancing等技能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。