其他分享
首页 > 其他分享> > 渲染管线基础

渲染管线基础

作者:互联网

什么是渲染管线:

渲染管线就是经过一系列的操作,把图形渲染到屏幕上的一个过程,这些操作总的来说就是:剔除、渲染、屏幕后处理。

不同的渲染管线,执行的操作不一样,输出的结果也不一样,比如一个加工布娃娃的流水线,A流水线就是缝合、输出,B流水线是缝合、点缀、输出

unity总体来说包含两种渲染管线,一种是内置的渲染管线,一种是可编程渲染管线

可编程渲染管线又分为三种:1、urp  通用渲染管线  2、hdrp  高清渲染管线  3、完全自定义的渲染管线

切换渲染管线

一般一个工程只是用其中一种渲染管线,所有的效果,都是经过该渲染管线输出的,切换不同的渲染管线,可能造成输出结果混乱,以为你的shader不符合当前的流程

如果要切换到另一个渲染管线,必须确保项目中的资源和代码兼容新的渲染管线实例

1.切换成内置的渲染管线

首先要确保没有使用任何的可编程渲染管线

1.1在editorsetting->quality->level 把所有的设置为none

1.2 设置为none

2.使用srp

渲染管线在unity中,是一种资源,首先 导入 package ,在packmanager 里可以找到

然后create->render->urp,选中它,可以看到其属性面板

也就是说,一个项目中可以有多个urp渲染管线的资源,一个资源代表一种配置,有时我们为了适配不同平台的性能,需要使用不同的urp设置

2.1 设置不同等级的urp

我们在graph 里面设置的是我们默认使用的渲染管线,如果我们想为低性能的手机设置低性能的urp怎么办?

首先 打开quality,可以看到默认是有6个等级,选中每个等级,下面就可以出现对应等级的设置,我们刚才在graphic里面设置的就是默认的渲染管线,如果这个地方使用了新的渲染管线,就会覆盖在graphic里面设置的,然后我们在c#中切换不同的设置,来做手机的性能适配

 在代码中设置,请注意,切换到新的渲染管线资源会使 Unity 销毁当前的渲染管线实例,并调用新渲染管线资源的 CreatePipeline() 方法。根据 SRP 中的代码,此操作可能在计算上是资源密集型操作。

GraphicsSettings.renderPipelineAsset = exampleAssetA;

如何选择哪种渲染器?

内置渲染管线,提供了多个渲染路径,比如前向渲染,延迟渲染,可以有多个渲染通道,可以很灵活的得到自己想要的效果,但是多通道渲染也会降低渲染速度

通用渲染管线 (URP) 是一种快速的单通道前向渲染器;它主要设计用于不支持计算着色器技术的低端设备,例如较早的智能手机、平板电脑和 XR 设备。但是,URP 还可为中端设备(如游戏主机和 PC)提供更高质量的图形性能,有时其性能成本低于内置渲染管线。URP 根据每个对象来剔除光线,并允许在单个通道中计算光照,与内置渲染管线相比,这会降低绘制调用次数。最后,URP 还提供 2D 渲染器,并规划了延迟渲染器。

它包括tile 和cluster 渲染技术

tile渲染是屏幕中一个小型二维方形像素,而cluster渲染则是摄像机视锥体中的一个三维体积。tile和cluster渲染技术都依赖于影响每个tile和cluster的光源的列表,然后可以用已知光源列表在一个pass中计算其光照。不透明对象很可能使用tile系统进行着色,而透明对象则依赖于cluster系统。该渲染器的主要优点是,与内置渲染管线(延迟)相比,光照处理速度更快,带宽消耗也大大减少,因为内置渲染管线依赖于更慢的多通道光照积累。

3.全局光照系统

如果要在场景中添加间接光照,必须使用 Unity 的两个全局光照系统之一,或者使用您自己的烘焙解决方案生成这种光照。在 Unity 的 Window > Rendering > Lighting 下提供的这两个系统是:

3.1

实时全局光照:这个系统完全依赖于第三方光照中间件 Enlighten。在 Unity 中的预计算期间,Enlighten 经历两个漫长的阶段:聚类和光线传输。第一个阶段是将场景简化为一组称为cluster的面片,第二个阶段是计算这些cluster之间的可见性。在运行时,这些预计算的数据用于以交互方式生成间接光照。Enlighten 的强大功能依赖于实时编辑光照的能力,因为预计算的数据依赖于聚类间的关系。然而,与其他传统的光照贴图技术一样,编辑场景中的静态几何体将触发新的预计算。目前正在从 Unity 中移除 Enlighten,并在研究一种新的解决方案

3.2

烘焙全局光照:光照被烘焙成lightmap以及light probe。烘焙 GI 系统可以使用下列其中一个光照贴图程序:

* 渐进光照贴图程序 (Progressive Lightmapper)

* Enlighten

4 light mode

光照模式

Light 组件的 Mode 属性是一种常常让人混淆的属性。

Light Inspector 中提供了三种光照模式

1.烘焙:从这些光源产生的直接和间接光照被烘焙成光照贴图,这可能是一个耗时的过程。处理这些光源不需要运行时成本,但是将所产生的光照贴图应用到场景中需要很小的成本。

2.实时:来自这些光源的直接光照和阴影是实时的,因此不会被烘焙成光照贴图。它们的运行成本可能很高,具体取决于场景的复杂性、阴影投射光源的数量、重叠光源的数量等。此外,如果启用实时全局光照,则会在运行时更新间接光照,从而产生性能成本。

3.混合:这种混合模式提供烘焙和实时功能(如烘焙间接光照和实时直接光照)的混合。场景中所有混合光源的行为及其性能影响取决于该场景的光照模式

必须注意的是,只有启用了烘焙全局光照系统时,光源的模式才有意义。如果不使用任何 GI 系统或只使用实时 GI 系统,那么所有烘焙光源和混合光源的行为就好像它们的 Mode 属性设置为 Realtime 一样。

5. 内置渲染管线

提供不同的渲染路径,不同的渲染路径,提供的功能不一样

5.1 前向渲染路径

basepass 只渲染一个逐像素光照和个顶点光照,剩下的逐像素光照,会一一执行一遍addpass

5.2 延迟渲染路径

使用延迟着色时,可影响游戏对象的光源数量没有限制。所有光源都按像素进行评估,也就是在一个pass中,计算所有光照的数据,存储到g-buffer中,而不用渲染多次pass,这意味着它们都能与法线贴图等正确交互。此外,所有光源都可以有剪影和阴影。

延迟着色的优点是,光照的处理开销与接受光照的像素数成正比。这取决于场景中的光量大小,而不管接受光照的游戏对象有多少。因此,可通过减少光源数量来提高性能。延迟着色还具有高度一致和可预测的行为。每个光源的效果都是按像素计算的,因此不会有在大三角形上分解的光照计算。

在缺点方面,延迟着色并不支持抗锯齿,也无法处理半透明游戏对象(这些对象使用前向渲染进行渲染)。此外,它也不支持网格渲染器 (Mesh Renderer) 的接受阴影 (Receive Shadows) 标志,并且仅在有限程度上支持剔除遮罩。最多只能使用四个剔除遮罩。也就是说,剔除层遮罩必须至少包含所有层减去四个任意层,即必须设置 32 个层中的 28 个层。否则,会产生图形瑕疵。

使用延迟渲染,需要有硬件的支持,必须支持shader mode3.0 和MRT(多个渲染目标)

在g-buffer中默认有4个render target 里面分辨存储了不同类型的光照数据

  • RT0,ARGB32 格式:漫射颜色 (RGB),遮挡 (A)。
  • RT1,ARGB32 格式:镜面反射颜色 (RGB),粗糙度 (A)。
  • RT2,ARGB2101010 格式:世界空间法线 (RGB),未使用 (A)。
  • RT3,ARGB2101010(非 HDR)或 ARGBHalf (HDR) 格式:自发光 + 光照 + 光照贴图 + 反射探针缓冲区。
  • 深度+模板缓冲区。

所以默认的G-buffer每一个像素占用内存 160 bits (没开启HDR) 或者192 bits(开启HDR).

如果混合光照模式为 ShadowmaskDistance Shadowmask,则使用第五个目标:

*RT4,ARGB32 格式:光照遮挡值 (RGBA)。

则G-buffer为每像素192 bits/pixel (没开启HDR) 或者 224 bits (开启HDR).

如果硬件不支持五个并发渲染目标,则使用阴影遮罩的对象将回退到前向渲染路径。 当摄像机不使用 HDR 时,发射+光照缓冲区 (RT3) 采用对数编码,因此提供的动态范围高于 ARGB32 纹理通常可能提供的范围。

请注意,当摄像机使用 HDR 渲染时,不会为发射 + 光照缓冲区 (RT3) 创建单独的渲染目标;而是将摄像机渲染到的渲染目标(即传递给图像效果的渲染目标)用作 RT3。

6.可编程渲染管线

可编程渲染管线允许我们在c# 层来调度和配置渲染命令,Unity 将这些命令传递给它的低级图形架构,后者随后将指令发送给图形 API。

Render Pipeline Instance and Render Pipeline Asset

每个基于 SRP 的渲染管线都有两个关键的自定义元素:

  • A Render Pipeline Instance. 继承自TRenderPipeline ,重写了其 Render() 方法,用来定义怎样渲染的
  • A Render Pipeline Asset. 这是在project面板中的一个资源,它包含了该渲染管线的一些配置数据,也就是上面渲染时用的,继承自 RenderPipelineAsset ,重写CreatePipeline() 方法.

6.1 在c#中配置和调度渲染命令(CommandBuffer、ScriptableRenderContext)

执行命令有两种方法,

第一种是使用commandbuffer,一次添加过个命令,然后把该命令交给ScriptableRenderContext,让它去告诉图形API执行

第二种是ScriptableRenderContext直接告诉图形API 执行命令,只不过每次只能执行单个命令

using UnityEngine;
using UnityEngine.Rendering;

public class ExampleRenderPipeline : RenderPipeline
{
        public ExampleRenderPipeline() {
        }

    protected override void Render(ScriptableRenderContext context, Camera[] cameras) {
        // 创建并调度命令以清除当前渲染目标
        var cmd = new CommandBuffer();
        cmd.ClearRenderTarget(true, true, Color.red);
        context.ExecuteCommandBuffer(cmd);
        cmd.Release();

         // 指示可编程渲染上下文告诉图形 API 执行调度的命令
        context.Submit();
    }

在调用Submit()方法前,是不会执行任何渲染命令的,必须要submit 才能执行命令

标签:渲染,光源,基础,像素,烘焙,管线,光照
来源: https://blog.csdn.net/qq_37672438/article/details/120103162