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

article/2025/7/24 3:32:05

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

    • 一 渲染的任务
    • 二 三个概念阶段
    • 三 应用阶段
      • 1 准备好需要被渲染的场景数据,做粗粒度剔除
      • 2 设置每个对象的渲染状态。
      • 3 发送DrawCall。
    • 四 几何阶段
      • 1 顶点着色器
      • 2 裁剪
      • 3 屏幕映射
    • 五 光栅化阶段
      • 1 三角形设置
      • 2 三角形遍历
      • 3 片元着色器
      • 4 逐片元操作

在这里插入图片描述
计算机图形库的渲染命令由显卡驱动(GPU Driver)翻译成GPU(图形处理器)能识别的语言,然后GPU读取显存中由渲染命令指定的数据(draw call则是把要求GPU根据顶点数据进行绘制, SetPass call时,会向显存中传递大量的资源信息,包括纹理资源也是在这时候加载到缓存中)

一 渲染的任务

渲染流水线的工作任务在于==由一个三维场景出发、生成(或者说渲染)一张二维图像。==换句话说,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像。而这个工作通常是由CPU和 GPU共同完成的。

二 三个概念阶段

在这里插入图片描述

三 应用阶段

CPU负责实现,这一阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将会被传递给下一个阶段——几何阶段。

1 准备好需要被渲染的场景数据,做粗粒度剔除

摄像机的位置,视锥体,场景中的模型,场景中的光源,粗粒度剔除也就是视锥体剔除在这个阶段做,以包围盒为单位

准备好数据后加载到显存

所有渲染所需的数据都需要从硬盘(Hard Disk Drive,HDD)中加载到系统内存(RandomAccess Memory,RAM)中。然后,网格,位置信息,法线方向,顶点颜色,纹理坐标等数据又被加载到显卡上的存储空间——显存( VideoRandom Access Memory,VRAM)中。这是因为,显卡对于显存的访问速度更快,而且大多数显卡对于RAM没有直接的访问权利。图2.3所示给出了这样一个例子。
在这里插入图片描述

2 设置每个对象的渲染状态。

渲染状态包括所使用的着色器shader、纹理、材质(漫反射颜色,高光反射颜色)等。

什么是渲染状态呢?一个通俗的解释就是,这些状态定义了场景中的网格是怎样被渲染的。例如,使用哪个顶点着色器(Vertex Shader)/片元着色器(Fragment Shader)、光源属性、材质等。如果我们没有更改渲染状态,那么所有的网格都将使用同一种渲染状态。图2.4显示了当使用同一种渲染状态时,渲染3个不同网格的结果。
在这里插入图片描述

3 发送DrawCall。

当给定一个DrawCall时,GPU会根据渲染状态和输入的顶点数据进行计算。

在这里插入图片描述

四 几何阶段

几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在哪里绘制它们。这一阶段通常在 GPU上进行。
几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。这个阶段可以进一步分成更小的流水线阶段,这在下一章中会讲到。==几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。==通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一个阶段。

1 顶点着色器

顶点Vertex不是点,是点及点的信息,几何信息和点位坐标,所以可以构成线段,多边形,叫做图元

顶点着色器(Vertex Shader)是流水线的第一个阶段,它的输入来自于CPU。顶点着色器的处理单位是顶点,也就是说,输入进来的每个顶点都会调用一次顶点着色器。顶点着色器本身不可以创建或者销毁任何顶点,而且无法得到顶点与顶点之间的关系。例如,我们无法得知两个顶点是否属于同一个三角网格。但正是因为这样的相互独立性,GPU可以利用本身的特性并行化处理每一个顶点,这意味着这一阶段的处理速度会很快。
顶点着色器需要完成的工作主要有:坐标变换和逐顶点光照(如果需要,也就是计算输出顶点的颜色)。当然,除了这两个主要任务外,顶点着色器还可以输出后续阶段所需的数据。图2.7展示了在顶点着色器中对顶点位置进行坐标变换并计算顶点颜色的过程。

齐次裁剪空间不是屏幕空间,是xyz都为1的空间

2 裁剪

由于我们的场景可能会很大,而摄像机的视野范围很有可能不会覆盖所有的场景物体,一个很自然的想法就是,那些不在摄像机视野范围的物体不需要被处理。而裁剪(Clipping)就是为了完成这个目的而被提出来的。
一个图元和摄像机视野的关系有3种:完全在视野内、部分在视野内、完全在视野外。完全在视野内的图元就继续传递给下一个流水线阶段,完全在视野外的图元不会继续向下传递,因为它们不需要被渲染。而那些部分在视野内的图元需要进行一个处理,这就是裁剪。例如,一条线段的一个顶点在视野内,而另一个顶点不在视野内,那么在视野外部的顶点应该使用一个新的顶点来代替,这个新的顶点位于这条线段和视野边界的交点处。
由于我们已知在NDC下的顶点位置,即顶点位置在一个立方体内,因此裁剪就变得很简单:只需要将图元裁剪到单位立方体内。图2.9展示了这样的一个过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFOyKy2H-1620137815507)(D:\强哥的文件\Typroa素材\image-20210226085232879.png)]

3 屏幕映射

这一步输入的坐标仍然是三维坐标系下的坐标(范围在单位立方体内)。屏幕映射(Screen Mapping)的任务是把每个图元的x和y坐标转换到屏幕坐标系(Screen Coordinates)下。屏幕坐标系是一个二维坐标系,它和我们用于显示画面的分辨率有很大关系。
假设,我们需要把场景渲染到一个窗口上,窗口的范围是从最小的窗口坐标(xy,)到最大的窗口坐标(x.yz),其中x<且y<y。由于我们输入的坐标范围在-1到1,因此可以想象到,这个过程实际是一个缩放的过程,如图2.10所示。你可能会问,那么输入的z坐标会怎么样呢?屏幕映射不会对输入的z坐标做任何处理。实际上,屏幕坐标系和z坐标一起构成了一个坐标系,叫做窗口坐标系(Window Coordinates)。这些值会一起被传递到光栅化阶段。

在这里插入图片描述

五 光栅化阶段

这一阶段将会使用上个阶段传递的数据(屏幕坐标系下的顶点位置以及和它们相关的额外信息,如深度值(z坐标)、法线方向、视角方向等。)来产生屏幕上的像素,并渲染出最终的图像。这一阶段也是在GPU上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。然后计算颜色它需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理。

1 三角形设置

光栅化的第一个流水线阶段是三角形设置(Triangle Setup)。这个阶段会计算光栅化一个三角网格所需的信息。具体来说,上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。它的输出是为了给下一个阶段做准备。

2 三角形遍历

在这里插入图片描述

这一步的输出就是得到一个片元序列。需要注意的是,一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包括了(但不限于)它的屏幕坐标、深度信息,以及其他从几何阶段输出的顶点信息,例如法线、纹理坐标等。

3 片元着色器

片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器中输出的数据插值得到的。而它的输出是一个或者多个颜色值。图2.13显示了这样一个过程。
这一阶段可以完成很多重要的渲染技术,其中==最重要的技术之一就是纹理采样。==为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标了
在这里插入图片描述

4 逐片元操作

终于到了渲染流水线的最后一步。逐片元操作(Per-Fragment Operations)是OpenGL 中的说法,在 DirectX中,这一阶段被称为输出合并阶段(Output-Merger)。Merger这个词可能更容易让读者明白这一步骤的目的:合并。而OpenGL中的名字可以让读者明白这个阶段的操作单位,即是对每一个片元进行一些操作。那么问题来了,要合并哪些数据?又要进行哪些操作呢?
这一阶段有几个主要任务。
(1))决定每个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。
(2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者说是混合。
需要指明的是,逐片元操作阶段是高度可配置性的,即我们可以设置每一步的操作细节。这在后面会讲到。
这个阶段首先需要解决每个片元的可见性问题。这需要进行一系列测试。这就好比考试,一个片元只有通过了所有的考试,才能最终获得和GPU谈判的资格,这个资格指的是它可以和颜色缓冲区进行合并。如果它没有通过其中的某一个测试,那么对不起,之前为了产生这个片元所做的所有工作都是白费的,因为这个片元会被舍弃掉。Poor fragment!图2.14给出了简化后的逐片元操作所做的操作。

在这里插入图片描述

在模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或是保留这个片段了。

我们先来看模板测试(Stencil Test)。与之相关的是模板缓冲(Stencil Buffer)。实际上,模板缓冲和我们经常听到的颜色缓冲、深度缓冲几乎是一类东西。如果开启了模板测试,GPU 会首先读取(使用读取掩码)模板缓冲区中该片元位置的模板值,然后将该值和读取(使用读取掩码)到的参考值(reference value)进行比较,这个比较函数可以是由开发者指定的,例如小于时舍弃该片元,或者大于等于时舍弃该片元。如果这个片元没有通过这个测试,该片元就会被舍弃。不管一个片元有没有通过模板测试,我们都可以根据模板测试和下面的深度测试结果来修改模板缓冲区,这个修改操作也是由开发者指定的。开发者可以设置不同结果下的修改操作,例如,在失
败时模板缓冲区保持不变,通过时将模板缓冲区中对应位置的值加1等。模板测试通常用于限制渲染的区域。另外,模板测试还有一些更高级的用法,如渲染阴影、轮廓渲染等。
在这里插入图片描述

如果一个片元幸运地通过了模板测试,那么它会进行下一个测试——深度测试(Depth Test)。相信很多读者都听到过这个测试。这个测试同样是可以高度配置的。如果开启了深度测试,GPU会把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较。这个比较函数也是可由开发者设置的,例如小于时舍弃该片元,或者大于等于时舍弃该片元。通常这个比较函数是小于等于的关系,即如果这个片元的深度值大于等于当前深度缓冲区中的值,那么就会舍弃它。这是因为,我们总想只显示出离摄像机最近的物体,而那些被其他物体遮挡的就不需要出现在屏幕上。如果这个片元没有通过这个测试,该片元就会被舍弃。和模板测试有些不同的是,如果一个片元没有通过深度测试,它就没有权利更改深度缓冲区中的值。而如果它通过了测试,开发者还可以指定是否要用这个片元的深度值覆盖掉原有的深度值,这是通过开启/关闭深度写入来做到的。我们在后面的学习中会发现,透明效果和深度测试以及深度写入的关系非常密切。

如果一个幸运的片元通过了上面的所有测试,它就可以自豪地来到合并功能的面前。
为什么需要合并?我们要知道,这里所讨论的渲染过程是一个物体接着一个物体画到屏幕上的。而每个像素的颜色信息被存储在一个名为颜色缓冲的地方。因此,当我们执行这次渲染时,颜色缓冲中往往已经有了上次渲染之后的颜色结果,那么,我们是使用这次渲染得到的颜色完全覆盖掉之前的结果,还是进行其他处理?这就是合并需要解决的问题。
对于==不透明物体,开发者可以关闭混合(Blend)操作。这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区中的像素值。但对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的。==图2.16展示了一个简化版的混合操作的流程图。

在这里插入图片描述


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

相关文章

UE4渲染管线学习笔记

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

Render Pipeline渲染管线概述

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

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

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

Unity渲染管线简介

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

Unity3D 渲染管线全流程解析

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

unity渲染管线及升级URP

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

Unity2020高清渲染管线

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

渲染管线流程

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

渲染管线入门

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

【OpenGL ES】渲染管线

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

渲染管线----通俗易懂向面试官介绍

本文通过简短的语言解释渲染管线&#xff0c;无论是第一次了解渲染管线&#xff0c;还是回顾&#xff0c;都有帮助。 一、完整渲染流程 在介绍渲染管线之前&#xff0c;先全局视角了解一下整个渲染引擎。 整个渲染分为五个阶段&#xff0c;如图 工具阶段、资产调节阶段、应用程…

学习笔记(一)渲染管线

目录 前言 一些疑问 一、什么是渲染管线&#xff1f; 二、为啥这玩意是个流水线&#xff1f; 1.CPU与GPU 2.CPU和GPU数据交互 3.CPU和GPU并行工作 Step1.应用程序阶段&#xff08;The Application Stage&#xff09; 一、把数据加载到显存中。 二、设置渲染状态。 三…

计算机图形学笔记(一)渲染管线概述

计算机图形学笔记&#xff08;一&#xff09;渲染管线概述 写在前面&#xff1a;因为之前有学习过图形学&#xff0c;博文是对过去知识的拾遗和对学习过程中的总结记录&#xff0c;所以在内容组织上可能不符合逻辑&#xff0c;某些比较熟悉的内容不会体现或简述&#xff1b;在整…

渲染基础-渲染管线(Render-pipeline)

一开始学习计算机图形学的小伙伴们肯定对于渲染管线有一点迷茫&#xff0c;至少当初我就有点迷茫&#xff0c;为了能对后来对计算机图形学感兴趣的萌新小伙伴起到一些帮助&#xff0c;在这里简单讲解一下渲染管线&#xff08;Render-pipeline&#xff09;。 该文章还有很多不足…

如何使用SPSS确定建立的回归模型能用于预测分析?

当需要研究一组随机变量与另一组变量的关系时&#xff0c;通常会运用回归分析。通过回归分析构建数学模型&#xff0c;探究两种或两种以上变量之间是否存在关系&#xff0c;若存在关系还可进一步预测未来的数据。 当自变量有多个而因变量只有一个时&#xff0c;则可构建spss多…

如何使用SPSS判断数据的正态分布

当我们应用统计方法对数据进行分析时&#xff0c;会发现许多计量资料的分析方法&#xff0c;例如常用的T检验、方差分析、相关分析以及线性回归等等&#xff0c;都要求数据服从正态分布或者近似正态分布&#xff0c;但这一前提条件往往被使用者所忽略。因此为了保证数据满足上述…

如何使用SPSS进行判别分析

今天将为大家讲解使用spss进行判别分析的相关步骤。 1&#xff0e;Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant Analysis 主对话框 &#xff08;1&#xff09;选择分类变量及其范围 在主对话框中左面的矩形框中选择表明已知的观测量所属类…

IBM SPSS Statistics定义变量使用介绍

IBM SPSS Statistics是一款强大的数据分析软件&#xff0c;它可以帮助我们解决很多复杂的统计学问题&#xff0c;使用SPSS的第一步就是要学会如何定义变量&#xff0c;下面让我们走进今天的SPSS入门教程。 一、进入变量视图 在定义变量之前&#xff0c;我们需要进入IBM SPSS …

SPSS使用过程中出现的问题整理 包括因子分析 感谢各位大佬们

spss使用方法整理 包括因子分析 一、遇到问题&#xff1a;spss导入excel数据显示:对于当前服务器语言环境而言,文本值过长二、SPSS数据分析-从EXCEL导入三、因子分析在SPSS中的操作过程及结果解读 一、遇到问题&#xff1a;spss导入excel数据显示:对于当前服务器语言环境而言,文…

通过SPSS使用命令语法实现快速删除变量的步骤

当我们面对一个庞大的数据集的时候&#xff0c;我们想要对该数据集进行一些操作&#xff0c;可能会觉得比较繁琐。为了快速精准的实现数据过滤操作&#xff0c; SPSS是自带了语法功能&#xff0c;通过语法即可快速实现复杂操作。今天小编将通过快速删除变量的操作&#xff0c;让…