SRP

URP和内建管线的一些编程上的差异

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com SubShader代码中的Tags 新增加了RenderPipeline关键字 SubShader的Tags段中需添加 "RenderPipeline" = "UniversalPipeline"语句段 光照模式(LightMode)关键字的对应替换 Built-in URP 作用 ForwardBase UniversalForward ForwardAdd 开启关键字_ADDITIONAL_LIGHTS解决 ShadowCaster ShadowCaster MotionVectors 尚未支持 Always 不再支持 PrepassBase 不再支持 PrepassFinal 不再支持 Vertex 不再支持 VertexLMRGBM 不再支持 VertexLM 不再支持 URP新增 DepthOnly URP新增 Meta 用于烘焙光照贴图 URP新增 Universal2D 用于2D的前向渲染 URP新增 UniversalGBuffer Deferred Rendering(延迟渲染)中使用,目前URP不支持延迟渲染,暂时用以兼容HDRP URP新增 UniversalForwardOnly 用于在Deferred Rendering(延迟渲染)中,表示这个Pass使用Forward Rendering(前向渲染) 变体相关的指令 内建管线中,提供了multi_compile_fwdbase来编译所有ForwardBasePass所需要的变体,multi_compile_fwdadd来编译ForwardAddPass所需要的所有变体,类似如下代码: #pragma multi_compile_fwdbase 而在URP中,需要自己判断需要编辑哪些变体,用户又更大的灵活性,类似如下(参考Lit.Shader): #pragma multi_compile _ _MAIN_LIGHT_SHADOWS #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE 参考网页 从 Builtin 管线升级到 URP

Scriptable Render Pipeline (SRP) Batcher

非SRP Batcher的Unity渲染管线怎么做 不多说,先看图: 图中有个Unity Engine propeties,其实就是指一些不需要我们显式地写在shaderlab代码的Propeties块中的uniform shader变量。比如物体的变换矩阵等等。 上图中的Unity Engine properties,以及各个材质球数据,存放在System Memory中。每当准备渲染物体时。CPU要将这些数据从System Memory中搜集起来,设置到shader的常量缓冲区中去(即CBUFFER,即从CPU传给GPU的数据,这些数据包含了shaderlab代码的Propeties块中的定义的变量)。在内部的渲染循环中,当渲染某个物体,发现需要用到一个新的材质数据时,CPU就将shader properties搜集起来。放到不同的常量缓冲区中去。这些常量缓冲区的个数,就取决着色器代码中声明了多少个。 SRP Batcher 的工作原理: 在 Unity 中,您可以在一帧中的任何时间修改任何材质的属性。然而这种做法有一些缺点。例如,当在一次DrawCall调用种使用新材质时,有很多工作要做。因此,场景中的材质越多,Unity设置 GPU用到的数据所需要的 CPU时间就越多。传统的处理方式是减少DrawCalls的数量来优化CPU端的渲染成本,因为Unity在发出DrawCall之前要设置很多东西。真正的 CPU耗时是耗在这些设置操作,而不是来自 GPU的绘制本身。这些设置操作也只是Unity 需要推送到 GPU 命令缓冲区的一些字节数据而已。 当场景中有大量的材质球,但是shader的变体比较少时,SRP Batcher就能进行优化。它的方法简而言之是:对Unity Engine properties,尽可能将其留存在GPU memory中。如果材质的内容没有发生变化的话,那么就不需要把这些数据上传到GPU memory上,从而省去了传统方式中的这部分CPU的工作。SRP Batcher专门定制了一些代码(dedicated code),可以快速地将Unity Engine properties更新到一个大的GPU 缓冲区(large GPU buffer) 中。如下图所示: 在上图中,CPU仅仅需要处理built-in engine properties,也就是诸如物体的变换矩阵等等。这是因为物体可能会移动,所以它的世界变换矩阵等等会经常发生变化。而其他的材质数据就被持久化地存储在CBUFFER中,这是因为大部分可渲染物体,它进行渲染时,传给shader的一些uniform变量一般都是保持,不随着时间的变化而变化的。这也就是说,SRP Batcher通过两种手段加速渲染: 每个可渲染物体的材质数据持久化存在显存中。 专门定制的代码管理一个大的逐物体GPU Buffer,即图中的Per Object large buffer块。 SRP Batcher compatibility 在任何给定的场景中,有些可渲染物体与 SRP Batcher 兼容,有些则不兼容。即使使用不兼容的对象,Unity 也能正确渲染场景。这是因为兼容对象使用SRP Batcher代码路径,而其他对象使用标准的SRP 代码路径。能使用SRP Batcher 代码路径渲染的可渲染对象必须是以下的类型: 渲染对象必须是一个mesh或skinned mesh。它不能是粒子。 着色器必须与 SRP Batcher 兼容。HDRP 和 URP 中的所有光照和非光照着色器都符合此要求(这些着色器的粒子版本除外)。 可渲染对象不得使用 MaterialPropertyBlocks。 要使着色器与 SRP Batcher兼容,必须遵循以下几点:

URP Shader Pass Tag

原文地址 以下是将上述回答表格化的结果: URP 中 ShaderLab Pass 标签参考 1. LightMode 标签 标签值 描述 适用场景 UniversalForward 渲染对象几何体并计算所有光照贡献。 Forward 渲染路径 UniversalGBuffer 渲染对象几何体但不计算光照贡献。 Deferred 渲染路径 UniversalForwardOnly 渲染对象几何体并计算所有光照贡献,可在 Forward 和 Deferred 渲染路径中使用。 Deferred 渲染路径中需要 Forward 渲染的对象(如 Clear Coat 法线) DepthNormalsOnly 用于深度和法线预渲染,生成环境光遮蔽(AO)。 Deferred 渲染路径,结合 UniversalForwardOnly 使用 Universal2D 渲染对象并计算 2D 光照贡献。 2D 渲染器 ShadowCaster 渲染对象从光源视角的深度到阴影贴图或深度纹理。 阴影生成 DepthOnly 渲染从相机视角的深度信息到深度纹理。 深度渲染 Meta 仅在 Unity 编辑器烘焙光照贴图时执行,构建时会被剥离。 光照贴图烘焙 SRPDefaultUnlit 用于绘制额外 Pass(如对象轮廓),适用于 Forward 和 Deferred 渲染路径。 绘制额外 Pass(如轮廓) MotionVectors 用于支持运动矢量(Motion Vectors)的 Pass。 运动矢量渲染 2.

The Universal Additional Camera Data component

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com URP版本:8.2.0 源参考网页 通用附加相机数据组件(Universal Addtional Camera Data Component) 是通用渲染管线(URP)用于内部数据存储的组件。通用附加相机数据组件使URP可以扩展和覆盖Unity标准相机组件的功能和外观。 在URP中,具有Camera组件的GameObject还必须具有通用附加摄影机数据组件。如果您的项目使用URP,则在创建Camera GameObject时,Unity会自动添加通用附加相机数据组件。您不能从带有Camera组件的game object中删除通用附加相机数据组件。 如果您使用脚本来控制和自定义URP,则可以通过以下脚本访问摄像机的通用附加摄像机数据组件: var cameraData = camera.GetUniversalAdditionalCameraData(); 有关更多信息,请参见UniversalAdditionalCameraData API文档。如果需要通过脚本频繁访问通用附加摄像机数据组件,则应缓存对其的引用,以避免不必要的CPU工作。

Universal Render Pipeline

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 1 URP的常见问题回答 URP和HDRP(High Definition Render Pipeline)不能混用。 可以从内建render pipeline转到URP。可以用升级器(upgrade)升级内建shader到URP shader。如果自定义的shader的话,需要手动去upgrade。 不能在运行期换pipeline asset。 URP和HDRP之间不能换用。 通过Package Manager获取URP的package 在URP Asset的【Player Setting】界面上可以找到Dynamic Batching的checkbox 选中材质球时,在Inspector面板中,找到Render Face选项,选择Both选项,即可开启Double Sided Global Illumination。 URP适用于各种平台,包括PC和mobile 在Built-in RP和URP功能对照表中,标识为Not Supported的功能,表示没有且不会在后续版本中实现。 如果在build URP工程时很慢,检查以下shader stripping是否设置对,要strip掉可以strip掉的shader。 缺省地,URP是在linear space中工作,可以在Player Setting中将其设置为在gamma space中工作。 通过创建ScriptableRendererFeature脚本,使用scriptable render pass可以扩展URP的功能。 2 URP Asset URP版本:8.2.0 源网页 要使用URP asset,需要创建一个URP asset,并在【Graphic settings】界面将其赋值使用。URP asset控制图形渲染的功能,设置图形渲染的质量等级。URP asset本身是一个scriptable object。它继承自RenderPipelineAsset类。在一个工程中可以使用多个URP asset,并且可以在它们之间切换使用,比如有个URP asset是启用了阴影,另一个URP asset关闭了阴影。 URP有以下几大类的控制选项,如下: General Quality Lighting Shadows Post-processing Advanced 下面的图显示了这几个控制选项的UI: 2.1 General 这是一些用于控制管道渲染框架的核心部分常规设置 属性名 描述 对应的编辑器变量名称 Depth Texture 当在一个摄像机对象的inspector界面上启用此项时,URP将会在shader中创建一个深度纹理_CameraDepthTexture。缺省地URP将把这个深度纹理交给你场景中的所有的摄像机去使用之。 m_RequireDepthTextureProp Opaque Texture 当在一个摄像机对象的inspector界面上启用此项时,URP将会在shader中创建一个不透明的深度纹理_CameraOpaqueTexture。缺省地,URP将这个深度纹理交给你场景中的所有的摄像机使用。这个深度纹理起的作用,就很类似于built-in render pipeline中的GrabPass。在URP渲染任意的透明状网格(transparent mesh)时,该纹理将会提供一个当前场景的一个快照(snapshot) m_RequireOpaqueTextureProp Opaque Downsampling 设置Opaque Texture属性的降采样方式,有None(不采样)、2倍线性过滤(2x Bilinear),、4倍线性过滤(4x Bilinear),、4倍盒状过滤(4x Bilinear),其中4倍盒状过滤产生一种轻柔羽化的效果 m_OpaqueDownsamplingProp Terrain Holes 禁用此项的话,在build包的时候,URP将会移出所有的Terrain hole shader变体,将会减少build包的时间 – 2.