URP基础
urp是unity2019后面出的功能,通用渲染管线。相比Built-in,在性能和效果都有提升。这篇笔记是通过从官方文档系统学习之后,做的笔记。 全称Universal Render Pipline。 通用渲染管线。 渲染,是指将三维场景转变到二位的屏幕的过程。 管线,是指这个过程中经历的各个细节,组成的像一条流水线作业一样的工序。
学习地址: https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.6/manual/integration-with-post-processing.html
学习开始时间:2021年11月2日 学习结束时间: 基础介绍
前期准备工作
urp分版本,不同的unity版本可以支持的urp版本也不同。 Urp Buit-in 和 HDRP 是相互独立的。只能选其一。 对硬件配置的要求也不同。
Build-in 和 URP的特性对比:
urp支持静态合批,不支持动态合批。
看下图: 左为Built-in, 右为urp
其实URP还是可以多Pass渲染的: https://blog.csdn.net/zakerhero/article/details/106264067
一些参数功能概括:
Depth Texture:允许URP创建一张相机深度纹理_CameraDepthTexture。保存了屏幕上每个点实际在3D场景中的深度。用于制作雾效等。常见效果:当前点越远,则设置雾感越浓。 Opaque Texture:_CameraOpaqueTexture —渲染完不透明物体后截屏的图
图像质量设置: HRR: the brightest part of the image can be greater than 1。 常见:制作燃烧/爆炸时,过热过亮的效果。 低端机可禁用以提高性能。 启用/禁用
MSAA: 多重采样抗锯齿。原理需要再学习一下, 2D中可不用。 可调整 2x 4x 8x抗锯齿级别。 禁用/启用8x时:
Render Scale:渲染级别,解释如下图: 为0时:
最大值为2时:
关于灯光: Main Light主光源的设置, 可设置是否逐像素光照。
设置逐像素光照后,才能设置是否接收投射阴影。 是:
否:
阴影纹理
还可以设置阴影纹理的级别: 256的效果:
4096的效果:
附加光的类型:
附加光即指:除上面主光源(太阳光)以外的光源。 比如灯泡。
逐顶点光与逐像素光:
最多可影响光数量
Per Object Limit: This slider sets the limit for how many additional lights can affect each GameObject. 最多可被多少附加光影响到。
0时:
1时:
附加光的阴影投射:
开启时:
关闭时就没有附加光的阴影了:
阴影设置
阴影距离
即大于多少距离后,将不会接收阴影。
距离1:
距离2时: 可看到阴影距离已经能显示到帽子下面去了
开得越大,阴影效果越好,内存占用越多。
阴影的抗锯齿:
Cascades: 未开启:
四倍的阴影抗锯齿:
阴影柔化
Soft Shadows: 未开启
开启后:
When enabled, the render pipeline performs a 5x5 Tent filter on desktop platforms and a 4 Tap filter on mobile devices. When disabled, the render pipeline samples the shadow once with default hardware filtering.
gamma与Linear
先介绍两种颜色空间,gamma与Linear
伽马校正:
再看下urp中gamam模式的效果:
Linear显示效果:
gamma整体有点过亮的感觉。
This is useful if you have many different Materials that use the same Shader.
动态合批Dynamic Batching:
将使用相同材质的动态物体合批。 to make the render pipeline automatically batch small dynamic objects that share the same Material. This is useful for platforms and graphics APIs that do not support GPU instancing If your targeted hardware does support GPU instancing, disable Dynamic Batching
混合光照
Mixed Lighting: 混合光照,是提供一种介于全烘培光照和全实时光照的一种折中方案,即某些物体的光照采用烘培另一些物体的光照采用实时计算。
Shader Log的等级
Shader Variant Log Level
Forward Renderer
按层渲染
可以分别设置需要渲染哪些透明层,哪些不透明层
透明物体的阴影
When this option is on, Unity draws shadows on transparent objects.
模板缓冲区的重写
就是shader里面的模板缓冲, 大于小于等于,自定定的某个值,就通过能测试,进入后续渲染中。
RenderFeature
在前向渲染中增加“渲染特性”Renderer Feature
设置渲染触发时机
材质统一重写
可以将全部材质,替换成RenderFeature中指定的材质,如下: 先看原图:材质为空时:
再替换成其他的:
再换个材质:
再换个材质:
材质分layer重写
如下,我先把墙的layer替换成water。
再在RenderFeature的材质重写中,设置对Default进行重写, 由于其他物体都是Default,只有墙体是Water,所以其他物体都被影响了。
深度测试与深度写入
图例:
渲染优先顺序: Queue值越小越先渲染,后渲染的物体会覆盖先渲染的物体。 系统中存在一个颜色缓冲区和一个深度缓冲区,分别存储颜色值和深度值,来决定画面上应该显示什么颜色。深度值是物体在世界空间中距离摄像机的远近,距离越近深度值越小,反之越大。 Less时: 这是符合人眼的最常见情况,远处的物体在重合时,会被近处的物体遮挡。
当设置Greater时:如下:由于开启了深度写入,远处的物体与近处物体重合时,远处的会通过深度测试,并写入深度缓冲区。所以只能看到场景最远处的图像。
模板测试:
URP渲染流程
图例
The URP renderer executes a Camera loop for each Camera 1.Culls rendered objects in your Scene 2.Builds data for the renderer 3.Executes a renderer that outputs an image to the framebuffer.
管线的生命周期细节
可调用事件如下: before and after rendering a frame, and before and after rendering each Camera loop 可以对应上面的图例中看
调用方式如下:
1、先读取管线中自定义配置的信息:
2、再使用这些信息进行裁剪。Uses the culling parameters from the previous step to compute a list of visible renderers, shadow casters, and Lights that are visible to the Camera. Culling parameters and Camera layer distances affect culling and rendering performance. 3、基础裁剪后输出的信息、从URP资源中做的品质设置,相机和当前平台去构建渲染数据。 4、设置渲染队列,以待执行, (这一步可重写,就是上面的自定义渲染管线事件) 5、执行渲染
URP-相机
所有管线共享光照中常见的功能,但也有区别。 光照组件有UPR特有的属性。 一些特殊参数: 间接光照
Indirect Multiplier: 间接光照的设置,由光线投射到一个物体后,再反射到其他物体上的光 此间接光照为什么没有效果?我设置了0与100,结果没有变化 光照的阴影类型 无阴影、硬阴影、软阴影三种,如下:
烘焙软阴影的角度 烘焙软阴影的半径 阴影强度 灯光阴影的强度–Strength: 为0时:
为0.5时:
为1时:
阴影位置拉远:
Depth:Controls the distance at which the shadows will be pushed away from the light. 可以将阴影推远一段距离。 靠近光源的那一端才会受到影响。 为1时:
为3时:
Render Mode重要性
如设置重要,则会一直逐像素渲染。 默认Auto就行。
光照影响的Layer 指定哪些层级才需要被渲染
随光照自带的组件 在URP管线中,自动附带,无法去除
URP-相机
附生组件
自动附带,可重写和扩展 The Universal Additional Camera Data component allows URP to extend and override the functionality and appearance of Unity’s standard Camera component. 获取方法: var cameraData = camera.GetUniversalAdditionalCameraData();
If you need to access the Universal Additional Camera Data component frequently in a script, you should cache the reference to it to avoid unnecessary CPU work.
基础式相机
分为基础式相机BaseCamera,覆盖式相机OverlayCamera. A Base Camera is a general purpose Camera that renders to a render target (a screen, or a Render Texture) An Overlay Camera renders on top of another Camera’s output. You can combine the output of a Base Camera with the output of one or more Overlay Cameras. This is called Camera stacking 可以将基础相机的输出与多个覆盖式相机的输出堆叠起来。称之为相机堆叠。
模式修改: var cameraData = camera.GetUniversalAdditionalCameraData(); cameraData.renderType = CameraRenderType.Base;
覆盖式相机:
You can use Overlay Cameras to create effects such as 3D objects in a 2D UI, or a cockpit in a vehicle. 场景中的图标:
You cannot apply post-processing to an individual Overlay Camera
单主相机堆叠渲染-应用
1、新建主相机
2、新建叠加相机
3、在主相机的“堆”属性中,加入叠加相机
4、如下效果 堆叠相机在主相机的基础上,渲染了帽子的一部分出来。
双主相机同屏渲染-应用
1、第一主相机视口设置,左半屏幕
2、第二主相机,视口设置,右半屏幕
3、最终效果
脚本设置(可选): myUniversalAdditionalCameraData.rect = new Rect(0.5f, 0f, 0.5f, 0f);
渲染至纹理-应用
如下图,其中的一张纹理,是由次相机实时渲染出来的。
1、增加渲染纹理-资源
2、增加材质球,并将纹理赋值给它
3、将次相机的输出纹理设置赋值刚才加的图片,–(仍然是Base模式)
此时,相机拍摄的画面,已经渲染到纹理 4、将材质球赋值给场景中的物体
效果:
1、2D UI渲染3D模型
3D models in a 2D UI
2、驾驶舱效果
the cockpit of a vehicle
3、分屏渲染
split screen rendering
4、CCTV monitors效果
多相机的优化
当使用单相机时,URP会对相机进行一些优化,以降低OverDraw. 但是当使用多相机时,这些优化将不存在,You must therefore be careful not to order the Cameras in a way that causes excessive overdraw.
多相机的渲染顺序
Unity renders the Overlay Camera’s output on top of the Base Camera’s output. 存在多相机时,Overlay的相机会显示在 基础相机的画面之上。
相机可以堆叠多个,按堆的顺序,决定其显示的顺序。
Render from top to bottom
脚本添加与移除
var cameraData = camera.GetUniversalAdditionalCameraData(); cameraData.cameraStack.Add(myOverlayCamera);
var cameraData = camera.GetUniversalAdditionalCameraData(); cameraData.cameraStack.Remove(myOverlayCamera);
颜色缓冲
基础相机在渲染队列开始时,颜色缓冲区会清空并渲染成天空盒的样子,或者固定颜色。 但是叠加相机不会清空,而是接收上一个相机的渲染结果。
深度缓冲
基础相机在渲染开始时,会清空深度缓冲区。 A Base Camera always clears its depth buffer at the start of each render loop. 叠加相机可选择是否清空。
由上面的效果可以对比出: 第1个图:在选择清理深度时, 由于主相机渲染结束,清理的深度,相当于深度缓冲区里没有信息, 这时候叠加相机再来进行渲染时,发现缓冲区没信息,于是所有深度都能写入。所以帽子被叠加相机拍到的地方都渲染出来了。 第2个图:但是选择不清理时,由于主相机渲染完,已经写了深度信息,再叠加相机再渲染帽子时,就要与之前的深度进行对比,深度测试,有些测试没通过,所以帽子没有被完整渲染出来。
When Clear Depth is set to true, the Overlay Camera clears the depth buffer and draws its view to the color buffer on top of any existing color data. When Clear Depth is set to false, the Overlay Camera tests against the depth buffer before drawing its view to the color buffer.
Overdraw
当使用多相机时,unity不再对 Overdraw进行优化。每个相机会对每个像素都绘制一次。所以需要自己处理好OverDraw问题。 可以用 Frame Debugger 调试问题。
抗锯齿Anti-aliasing
Fast Approximate Anti-aliasing (FXAA) Smooths edges on a per-pixel level。 按每像素,去平滑边缘。 Subpixel Morphological Anti-aliasing (SMAA) 查找图像边框中的图案,并根据这些图案,去混合像素。
Stop NaN
to make this Camera replace values that are Not a Number (NaN) with a black pixel. 使此相机用黑色像素替换非数字 (NaN) 的值。
Priority优先级
可以设置相机渲染的优先级,数字越大,渲染的画面会越后渲染出来。
Volume Trigger 体积触发器
可以将其他对象的transform传入到相机这个植,之后相机将使用该transform所在的位置的Volume和后处理效果。
URP-着色器
简介(共四类着色器) (PBS):Physically Based Shaders 基于物理的着色器 (PBR):non-Physically Based Rendering 非基于物理的渲染
Lit Shader: 跨硬件的逼真效果。
Simple Lit shader: is non-PBR. 应用于低端机或者只有简单光照的条件下。
Baked Lit Shader: 预先烘焙好,烘焙光, 特点:基于物理渲染,效果好,但非实时光照。
Unlit Shader: 无需光照的着色。
1、PBS基于物理着色器
两条准则: 1、When light hits a a rendered object’s surface, part of the light is reflected and part is refracted. The reflected light is called specular reflection. 2、当光线渲染到物体表面时,部分被反射,部分被折射。反射光叫高光。高光主要取决于入射的角度。 3、金属物体,表面会吸收和改变光。 4、For metal objects, the surface absorbs and changes the light. For non-metallic objects, also called dielectric objects, the surface reflects parts of the light. 5、Light attenuation(衰减) is only affected by the light intensity. 6、Lit 和 Particles Lit 使用的是PSB 7、不支持低端机
2、Simple shading简易着色器
比较适合于风格化的效果, 渲染结果并不会很逼真/写实。 基于Blinn_Phone模型。 材质会反应漫反射和高光。
3、Baked Lit shading烘焙着色器
无实时光照。real-time lighting 可以从光照贴图或者光照探针接收烘焙光信息。 用消耗较低。 可以在低端机跑。
4、Shaders with no lighting无光着色器
用于不需要计算光照的模型上, 可以直接设置颜色, 且颜色将不受光的影响。
选项-工作流模式
高光模式
金属模式
选项-表面类型
URP renders transparent Materials in a separate pass after opaque objects. Transparent 透明
Opaque: 不透明
选项-渲染前/背/双面
Front:
Back:
Both:双面
选项-Alpha Clipping
URP does not render alpha values below the specified Threshold 0.1时:
0.3时:
选项-阴影接收
Tick this box to enable your GameObject to have shadows cast upon it by other objects
开启/关闭时:
Base Map-基础贴图
as the diffuse map
使用纹理的信息去计算透明或者透明裁剪。 If you select Transparent or Alpha Clipping under Surface Options, your Material uses the Texture’s alpha channel or color.
Specular Map-高光/金属贴图
在高光贴图上,
Occlusion Map-遮蔽贴图
The occlusion map is used to provide information about which areas of the model should receive high or low indirect lighting. Indirect lighting comes from ambient lighting and reflections, so steep concave parts of your model like a crack or a fold would not realistically receive much indirect light. 环境光用来给模型提供亮暗的间接光信息。 间接光来自于环境光和反射光。 主要应用于类似裂缝、夹层等位置。那些地方接收的间接光比较少。
下图:左边无遮蔽。右边有。 可以看到当前模型是背光的,边上还有衣服挡住,所以在脖子位置应该受到的间接光很少,所以应该要显得较暗(如右边一样)。
Normal Map–法线贴图
With a normal map, you can add surface details like bumps, scratches and grooves. 主要用于增加模型表面凹凸、划痕和凹槽等效果。带来细节。
对比左边(没)和右边(有)的区别如下:
The normal map picks up ambient lighting in the environment. 法线贴图的光线,取的是环境光。
还可以调节凹凸的程度:
Emission-表面发光贴图
Makes the surface look like it emits lights。 使表面看起来是在发光。 对比自发光效果:
Tiling-平铺调整
This is good for surfaces like floors and walls. Set a higher value to make the Texture repeat across your mesh 为1时:
为10时:
Offset-平移uv
move the Texture across the U or V axes.
高级-Specular Highlights Enable this to allow your Material to have specular highlights from direct lighting 启用此选项可让您的材质具有来自直接照明的镜面高光,例如定向、点和聚光灯。 高级-环境光反射 Sample reflections using the nearest Reflection Probe, or, if you have set one in the Lighting window,
高级-GPU Instancing
Makes URP render meshes with the same geometry and Material in one batch 风格并且材质相同的物体,可以在one batch渲染。 高级-优先级Priority URP renders Materials with higher values first. Use this slider to determine the chronological rendering order for a Material. URP renders Materials with higher values first.
Shader Stripping剥离
如果某些选项(如阴影)是用不到的,可以在URP Assets中去取消勾选。
则在之后的shader变体中,将不会计算阴影。 此举可有助于提升性能。
自定义shader开始—
包含以下部分: ?Shader ?Properties ?SubShader ?Pass ?HLSLPROGRAM 路径和名称声明:Shader block Shader “Example/URPUnlitShaderBasic”
属性标签:Properties block
SubShader block子标签:
Pass block:
Tags标签:
HLSLPROGRAM block块:
引用库添加:
顶点着色:
片元着色:
SRP批处理兼容的标签
To ensure that the Unity shader is SRP Batcher compatible, declare all Material properties inside a single CBUFFER block with the name UnityPerMaterial
shader中增加纹理
1、声明属性:
2、从模型信息中获取uv坐标:
3、声明纹理类型及其采样器
1、定义 _BaseMap_ST,用来修改纹理的 offset 与 tilling
2、TRANSFORM_TEX执行宏
3、根据纹理、采样器、uv坐标,进行采样
得到uv点的颜色信息
可视化法线信息
其他常见问题:
URP-后处理
Post-processing 使用的是Volume framework做支持。
效果展示
未加后处理:
加了后处理之后:
可以看到,加了之后,效果更好。特别是光影。没有那种泛白的感觉。当然这只是对于这个电影而言。它只是使用了后处理效果的一部分。
使用步骤
1、先添加Volume组件
2、添加配置文件
1、增加具体的后处理效果
对移动设备友好的效果
Volume作用范围
分为Global与local。 Global模式,对全局生效。 local模式,可以指定范围,且可以指定位置。
影响因子
At runtime, URP goes through all of the enabled Volume components attached to active GameObjects in the Scene, and determines each Volume’s contribution to the final Scene settings unity会综合各个Volume的效果,结合他们的贡献,计算出最终的结果。
Volume Profile
是Volume的配置文件 A Volume Profile is a Scriptable Object which contains properties that Volumes use to determine how to render the Scene environment for Cameras they affect.
Volume Overrides
系统会有一套默认的属性,所以你可以重写它们。
–Bloom(辉光)
The Bloom effect creates fringes of light extending from the borders of bright areas in an image. Bloom 效果创建从图像中明亮区域的边界延伸的光条纹 效果对比: bloom前:
bloom后:
Threshold:阈值,0~正无穷。 只有高于阈值的亮度,才会产生Bloom效果。
Intensity:强度
0.5 与 5对比
Scatter:分散度。 设置radius 效果的半径。 0.5与0.9对比
Tint: 设置bloom颜色。
Clamp: 限制。 限制最大上限值。
Lens Dirt-将纹理赋值进去,屏幕Bloom越强的区域,纹理显示越清晰。 如下是用到的纹理:
当未开启Dirt Texture时:
开启后:
还可以调整其强度:
–Channel Mixer(通道混合)
通道混合器。 可以对最终渲染结果,修改rgb的混合 。
比如在红通道增大绿色值时, 原本绿色的区域,会被红绿交叉色(黄色)占据。
如下三图,分别为绿通道 -100,+29,+99时的效果。
–Chromatic Aberration(迷幻色差)
色差。 在明暗分界的地方,产生颜色条纹。
–Color Adjustments整体调色
整体颜色调整
–Color Adjustments曝光 曝光(Exposure): -4时:
0时:
4时:
–Color Adjustment对比度
Contrast(对比度): 对比度的原理可以看下图:
对比度指设置图像暗和亮的落差值。对比度越大,则亮部更亮,暗部更暗,区别更明显,也显得图像更清晰。
再看unity中的效果对比: 0时:
100时:
–Color Adjustments改色
Color Filter: 色彩的整体调整.
–Color Adjustments色相
色相修改:Hue Shift 调整对应的角度值来改变色相,范围在-180-180度之间,正好是360度,一个色相环 色相0时(原图):
色相180时:
可以看到,颜色鲜艳的部分,相当于被换过颜色了。 但如果是偏白或者偏暗的地方,则受影响较小。
–Color Adjustments饱和度
Saturation:饱和度调整
饱和度是指色彩的鲜艳程度。 也称色彩的纯度。
unity中的,设置最低饱和度,-100时
设置饱和度最高,100时
–Curves曲线调色
拿上面的图说, 左边是0,右边是1,中间是整体色彩从0-1之间的范围。 曲线是对原值的调整。 比如最左边的点拉到Y轴最上面,代表把图片里最暗的偏黑的部分,变成偏白。 右边也是这个道理。
–Depth Of Field景深
效果:
–Film Grain胶片颗粒
模拟老电影感觉。 胶片颗粒效果模拟摄影胶片的随机光学纹理,通常是由物理胶片上存在的小颗粒引起的。 是一种动态的效果。 在运行时看到画面上一直有颗粒状模糊的黑点在动的感觉。 模拟那种满屏幕噪点的感觉。
并且可以自定义噪点纹理。
比如我用一张QQ音乐的图片:
效果就成了这样:
–Lens Distortion(失真)
失真效果,会扭曲最终渲染出的图片,模拟真实镜头的效果。 The Lens Distortion effect distorts the final rendered picture to simulate the shape of a real-world camera lens. 如下,0的效果:
0.5时:
1时:
-0.5时:
-1时:
–Lift Gamma Gain
这个有点复杂,看不懂
–Motion Blur运动模糊
运动模糊效果模拟当真实世界的相机拍摄移动速度超过相机曝光时间的物体时图像中出现的模糊。
只对相机生效。 需要在相机运动时,才能的到效果。
–Panini Projection 圆柱形
此效果可帮助您在具有非常大视野的场景中渲染透视图。帕尼尼投影是圆柱投影,这意味着它保持垂直直线笔直和垂直。 与其他圆柱投影不同,帕尼尼投影使穿过图像中心的径向线也保持笔直。
为0时:
为1时:
–Shadows Midtones Highlights对阴影/中间调/高光的调色
可以专门定义 阴影、中间调、高光的色彩范围。 如下:阴影修改前:
阴影修改后:
–Split Toning阴影与高光调色
此效果根据亮度值对图像的不同区域进行着色,以帮助您获得更独特的外观。您可以使用它为场景中的阴影和高光添加不同的色调 还有一项平衡值: 越低,则阴影越明显。
越高,则高光越明显。
–Tonemapping色调映射
是把HDR值映射到一个新的范围,的过程。 把HDR变成LDR HDR:高动态范围 LDR:Low Dynamic Range 分为ACES和Neutral两种效果:
ACES:由美国电影艺术与科学学会提出,是一套颜色编码系统,或者说是一个新的颜色空间。它是一个通用的数据交换格式,一方面可以不同的输入设备转成ACES,另一方面可以把ACES在不同的显示设备上正确显示。不管你是LDR,还是HDR,都可以在ACES里表达出来。
Aces算法:
aces曲线:
None时:
ACES效果:
Neutral效果: (偏灰):
–Vignette光晕
图像边缘变暗及去饱和效果。
通过用来达到聚焦于图像中心的效果。 You can use vignetting to draw focus to the center of an image.
可以调节颜色、强度、光晕在屏幕的中心位置、平滑度、圆度。
调节光晕成红色:
移动光晕中心点的位置至右下角:
增加光晕的强度:
降低光晕的柔和度:
勾选“圆”形效果:
–White Balance白平衡
用来消除不切实际的色偏,以便在现实生活中显示为白色的项目在最终图像中呈现为白色。 还可以使用白平衡在最终渲染中创建整体更冷或更暖的感觉
-50时:
50时:
还可以补偿 绿色或者洋红色调。
|