渲染管线基础

article/2025/7/24 3:16:16

什么是渲染管线:

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

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

如果混合光照模式为 Shadowmask 或 Distance 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 才能执行命令


http://chatgpt.dhexx.cn/article/RVpCuoy6.shtml

相关文章

第二十章 Unity 渲染管线

渲染管线是计算机图形中最基础最核心的部分,它是将3D场景显示到2D平面的技术过程。在DirectX课程中,我们就介绍了渲染管线,分为固定渲染管线和可编程渲染管线(Shader)。但是在DirectX 10版本之后统一了渲染架构&#x…

OpenGL 图形渲染管线

学习笔记,自用 ヾ(•ω•)o 参考:《细说图形管线》、games101等等 Unity 中的渲染优化技术 大致流程细说图形渲染管线顶点数据:VS (顶点着色器Vertex Shader):TS(triangle shader)GS (几何着色器Geometry …

Unity URP/SRP可编程渲染管线

URP是unity推出的,用于替代Unity原来传统build-in管线。 URP是Unity可编程渲染管线(SRP)的一种,所以了解URP之前需要先了解SRP是什么 SRP是什么? SRP全称为Scriptable Render Pipeline(可编程渲染管线/脚本化渲染管线&#xff0…

GPU渲染管线概述

在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为…

Unity渲染管线详解

1.UnityBuild-in渲染管线 当双摄像机的时候,注意Camera中的Clear Flags 和 Depth。 其中Clear Flags在摄像机在渲染时,会进行清屏的操作。选择skybox是除了天空盒都会被清除。 Depth数值越小越先被渲染。 层级剔除:culing mask选择被剔除的…

渲染管线详细概念讲述

1、渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景。 2、渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的的并行处理单元。一个流水线是一序…

渲染管线概论

什么是渲染管线 渲染管线(渲染流水线)是将三维场景模型转换到屏幕像素空间输出的过程。图形渲染管线主要包括两个功能:一是将物体3D坐标转变为屏幕空间2D坐标,二是为屏幕每个像素点进行着色。 渲染管线的流程 渲染管线的一般流…

unity默认渲染管线切换到URP渲染管线并切换材质

先简单介绍一下渲染管线(URP)是什么,最初的名称是LWRP(Lightweight Render Pipeline),从2019.3版本以后改名为URP(Universal Render Pipeline),提供了对美术师友好的工作…

渲染管线

概述 (Introduction) 图形渲染管线是实时渲染的核心组件。渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一副2D的图像。如上图所示,场景中的3D物体通过管线转变为屏幕上的2D图像。渲染管线是实时渲染的重要工具,实时渲…

Unity渲染流程(渲染管线)(渲染流水线)

Unity渲染流程(渲染管线)(渲染流水线) 一 渲染的任务二 三个概念阶段三 应用阶段1 准备好需要被渲染的场景数据,做粗粒度剔除2 设置每个对象的渲染状态。3 发送DrawCall。 四 几何阶段1 顶点着色器2 裁剪3 屏幕映射 五…

UE4渲染管线学习笔记

菜鸡入门学习笔记,各种不足还请大佬指点 CSDN传上来的图会变糊,将就看了只有,理解就行。。 个人比较推荐的学习顺序: 1.UE官方渲染介绍: Epic Games 2.UE是如何渲染一帧的: 原文 Unreal – Interplay of Light 译 译:UE4是如…

Render Pipeline渲染管线概述

渲染(Render)定义 渲染在电脑绘图中是指软件从模型生成图像的过程,通俗讲就是在计算机里面给虚拟世界"拍照"。渲染主要分为两种,一种是预渲染(pre-rendering),它的计算强度很大,通常用于电影制作;另一种是实…

【Unity】Unity Shader学习笔记(二)渲染管线

文章目录 渲染管线(Randering Pipeline)渲染流程可编程渲染管线应用阶段把数据加载到显存中设置渲染状态调用DrawCall 几何阶段、光栅化阶段 渲染管线(Randering Pipeline) 渲染管线是将网格、纹理等信息从加载到展现在屏幕上的整…

Unity渲染管线简介

unity渲染管线分为 Build in Render(内置渲染管线)和Scriptable Render Pipline(可编程渲染线) 1.Build-In Render 内置渲染器(默认)兼容太多,反而不能面面俱到,效果不好 2.Scriptable Render Pipline 可编…

Unity3D 渲染管线全流程解析

目录 渲染管线(流水线,流程) 一、渲染任务 二、三个阶段 1、应用阶段 1-1:数据的准备 1-2:设置渲染状态 1-3:发送DrawCall 2、几何阶段 2-1:顶点着色器 2-2:裁剪 2-3&#xff1a…

unity渲染管线及升级URP

unity渲染管线及升级URP 一,unity渲染管线简介二,通用渲染管线URP三,shader升级URP1,Builtin RP和URP中内置Shader 的对应2,总体结构3,include4,光照模式LightMode5,变体Variants6&a…

Unity2020高清渲染管线

一、高清渲染管线加载与环境配置 这里使用2019.3.0f6版本 1、加载高清渲染管线(High Definition RP) 2、创建高清管线脚本文件 3、配置高清渲染管线环境(把色彩空间改为线性空间) 4、把高清渲染管线脚本添加到图形(G…

渲染管线流程

应用阶段--->几何阶段---->光栅化阶段---->逐片元操作----->后处理 1,应用阶段:粗粒度剔除,进行渲染设置,准备基本数据,输出到几何阶段。 2,几何阶段:顶点着色器,曲面细…

渲染管线入门

渲染管线中一些技术名词大部分是英文直译,光看中文很容易被误导。所以我们必须在了解一个技术的具体作用之后,才能了解它到底是什么。这篇博客我主要翻译自Minh Tri Do Dinh的GPUs - Graphics Processing Units一文。也就是一些论坛里推荐给新手阅读的图…

【OpenGL ES】渲染管线

1 前言 渲染管线是指图形渲染流程,涉及到的概念非常多,主要包含图元、片段、光栅化、空间、变换、裁剪、着色器、片段测试、混合等。渲染管线主体流程如下: 为方便读者理解渲染管线,本文将先介绍顶点数据、图元与片段、空间与变换…