ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

渲染管线基础

2021-09-05 19:31:09  阅读:368  来源: 互联网

标签:渲染 光源 基础 像素 烘焙 管线 光照


什么是渲染管线:

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

不同的渲染管线,执行的操作不一样,输出的结果也不一样,比如一个加工布娃娃的流水线,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 前向渲染路径

  • Render Mode 设置为 Not Important 的光源始终为每顶点或 SH 光源。
  • 最亮的方向光始终为每像素光源。
  • Render Mode 设置为 Important 的光源始终为每像素光源。
  • 如果上述情况导致光源数少于当前的quality中设置的 Pixel Light Count (不同的level 可以设置不同的逐像素光照),则按照亮度降低的顺序,更多光源采用每像素渲染方式

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有