Unity3D 渲染管线全流程解析

article/2025/7/24 8:50:55

目录

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

一、渲染任务

二、三个阶段

1、应用阶段

        1-1:数据的准备

        1-2:设置渲染状态

        1-3:发送DrawCall

2、几何阶段

        2-1:顶点着色器

        2-2:裁剪

        2-3:屏幕映射

3、光栅化阶段

        3-1:三角形设置

        3-2:三角形遍历

        3-3:片元着色器

        3-4:逐片元操作

        


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

声明:本文章参考自《Real-Time Rendering》书籍加以汇总并引用了其中部分图片

一、渲染任务

        渲染的任务其实就是从一个三维场景出发,将其进行渲染生成一个二维图像供人眼观察。详细点说,就是CPU和GPU配合,将3D场景中各个对象的坐标,纹理,材质等信息经一系列转换生成人眼可以看见的图像映射到屏幕上。

二、三个阶段

        渲染的三个阶段一般分为,应用阶段,几何阶段和光栅化阶段,其大致的流程参考下方图1

 图1 渲染管线流程图

三个阶段的操作对象的流程图大致可以参考一下 图2

 图2 渲染管线操作对象流程图

1、应用阶段

        这一阶段由CPU处理,主要任务是为接下来GPU的渲染操作提供所需要的几何信息,即输出渲染图元(rending primitives)以供后续阶段的使用。渲染图元就是由若干个顶点构成的几何形状,点,线,三角形,多边形面都可以是一个图元。

        1-1:数据的准备

         第一步应先将不需要的数据剔除出去,如以包围盒为单位的视锥体(粗粒度)剔除,遮挡剔除,层级剔除等等。

         第二步根据UI对象在Herachy面板深度值的顺序(DFS深度优先搜索)设置渲染的顺序,其余物体大体可以按照离摄像机先近后远的规则为后续循环绘制所有对象制定排队顺序。

         第三步先将所有需要的渲染数据从硬盘读取到主存中,再把GPU渲染需要用到的数据打包发给显存(GPU一般没有对主存的访问权限,且与显存进行交换速度较快)。

打包的数据详细信息见图3

 图3 打包的数据信息

        1-2:设置渲染状态

         渲染状态包括着色器(Shader),纹理,材质,灯光等等。

         设置渲染状态实质上就是,告诉GPU该使用哪个Shader,纹理,材质等去渲染模型网格体,这个过程也就是SetPassCall。当使用不同的材质或者相同材质下不同的Pass时就需要设置切换多个渲染状态,就会增加SetPassCall 所以SetPassCall的次数也能反映性能的优劣。

        1-3:发送DrawCall

         当收到一个DrawCall时,GPU会按照命令,根据渲染状态和输入的顶点信息对指定的模(网格)进行计算渲染。

         CPU通过调用图形API接口( glDrawElements (OpenGl中的图元渲染函数) 或者 DrawIndexedPrimitive (DirectX中的顶点绘制方法) 命令GPU对指定物体进行一次渲染的操作即为DrawCall。此过程实质上就是在告诉GPU该使用哪个模型的数据(图形API函数的功能就是将CPU计算出的顶点数据渲染出来)。

在应用阶段有三个衡量性能指标非常重要的名词 下面我将再次叙述一下

DrawCallCPU每次调用图形API接口命令GPU进行渲染的操作称为一次DrawCall。

SetPassCall:设置/切换一次渲染状态。

Batch:把数据加载到显存,设置渲染状态,CPU调用GPU渲染的过程称之为一个Batch。

注:一个Batch包含至少一个DrawCall

  

2、几何阶段

        几何阶段由GPU进行处理,其几乎要处理所有和几何相关的绘制事情。如绘制的对象,位置,形状。几何阶段处理的对象时渲染图元,进行逐顶点和逐多边形的操作。主要任务是把顶点坐标变换到屏幕空间中,以供给接下来的光栅器进行处理。具体输出的信息有,变换后的屏幕二位顶点坐标,顶点的深度值,着色,法线等等信息。

接下来对几何阶段的主要流水线阶段进行一下解释:

        2-1:顶点着色器

        流水线的第一个阶段,其可以通过编程进行控制。输入来自CPU发送的顶点信息,每个顶点都会调用一次顶点着色器。其主要工作为:坐标转换和逐顶点光照(可选,计算输出顶点的颜色值)。坐标转换是必须完成的一个任务。其把顶点坐标从模型空间转换到齐次裁剪空间。(齐次裁剪空间不是屏幕空间,是xyz均放缩到-1到1的空间),具体过程可以参考图4

(提一下:此时GPU处理的顶点并不清楚顶点之间的关系,只是无差别的对待每个顶点,能             很好的体现各个部件的分离,降低耦合性)

图4 坐标转换

        2-2:裁剪

         顾名思义,就是将不需要的数据对象剔除出去的过程。由于场景一般很大,摄像机的视野范围可能不会覆盖所有的场景物体,裁剪就是为了将那些在摄像机视野范围外的物体剔除出去而被提出来的。

        一个图元和摄像机的关系有三种:完全在视野内、部分在视野内、完全在视野外。完全在视野内的就传递给下一个流水线阶段,完全在视野外的就不会向下传递,而部分在视野内的就需要进行一次处理,就是裁剪。

下图(图5)展示了一个裁剪的过程:

图5 裁剪过程

        由图5可清楚的看出,除完全在空间内外的图元被保留和舍弃以外,部分在空间内的图元(黄色三角形)会被裁剪,新的顶点将在空间的边界处生成,原来在外部的顶点会被舍弃 。

        2-3:屏幕映射

                通过计算将实际场景的对象映射到屏幕上,实质上就是对坐标的放缩,参考图6

图6 屏幕映射

3、光栅化阶段

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

        3-1:三角形设置

         其主要任务是为后续光栅化提供所需要计算的信息。例如,后续阶段需要判断像素点是否被三角形网格覆盖,只靠上个阶段得到的顶点信息无法确定边界的覆盖情况,还需要三角形网格边的信息,所以在这个阶段需要计算出边的表达式以供后续判断的使用。其输出都是为了给下一阶段做相应的准备。

        3-2:三角形遍历

         三角形遍历阶段会根据上一个阶段的计算结果判断一个三角形网格覆盖了哪些像素,并使用三角网格三个顶点的顶点信息对整个覆盖区域进行插值。详细过程见下方介绍:

         此阶段会遍历所有的像素点,判断其是否被三角网格所覆盖 (用3-1计算的结果) ,如果被覆盖,则在此像素点上生成一个片元。片元不是单纯的像素点,其还包含很多状态的集合,这些状态用来最终计算检测筛选每个像素点最终的颜色。(部分状态包括:屏幕坐标,深度值,从几何阶段继承来的法线,纹理等等)。

          片元状态的信息是由其所在三角形网格的三个顶点的信息的插值得到的,例如计算三角形网格重心位置片元的深度 如下图(图7)

 图7 片元状态信息插值

         最终输出的是包含多个片元的片元序列

        3-3:片元着色器

         非常重要的可编程着色器阶段。片元着色器的输入是上一个阶段对顶点信息插值得到的结果,输出为每个片元的颜色值。这一阶段可以按需完成很多重要的渲染技术,最重要的技术之一就是纹理采样

          纹理采样

          为了在片元着色器中进行纹理采样,先在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角形网格的三个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标了。其局限在于仅可以影响单个片元。即执行片元着色器时,不能将结果直接发给旁边的邻居。片段着色器输出颜色的具体过程如下图(图8)

图8 计算输出颜色 

        3-4:逐片元操作

         这是OpenGL中的说法,在DirectX中,这阶段被称为输出合并阶段(Output-Merger)。

        该阶段是对每一片 片元 进行操作,主要任务有:

        ①决定每个片元的可见性,如深度测试、模板测试。

        ②如果一个片元通过了所有测试,就把这个片元的颜色值和已经存储在颜色缓冲区的颜色进             行合并,混合。

                该阶段是高度可配置的,我们可以设置每一步的操作细节。该阶段首先解决的是,每个         片元的可见性问题。这需要进行一系列测试,只有通过了才能和颜色缓冲区进行合并。没通            过任何一 个测试,片元都会被丢弃。见图(9)

图9 片元测试及合并

         测试过程是很复杂的,不同接口实现细节也不同,下面笔者将讲述一些常用的测试:

         模板测试

                开启了模板测试,GPU就会使用读取掩码读取模板缓冲区中该片元的模板值,将该值和读取到的参考值进行比较。这个比较函数可以是开发者指定的,例如小于模板值时则舍弃该片元或者大于模板值时舍弃该片元。片元无论有没有通过模板测试都可以根据模板测试和下面的深度测试结果来修改模板缓冲区。这个修改操作也是由开发者指定的。模板测试通常用于限制渲染的区域。

        深度测试

        通过模板测试后,片元就会进行深度测试。其同样是高度可配置的。

        开启后,GPU会把该片元深度值和已存在与深度缓冲区的深度值进行比较,这个比较函数也是开发者设置的。例如小于缓冲区深度值时舍弃该片元,或者大于缓冲区深度值等于时舍弃该片元。通常人们更希望显示离摄像机最近的物体,所以一般比较函数设置为当前片元深度值要小于缓冲区深度值,深度值大无法通过测试。如果片元没有通过测试,则会被丢弃掉。

与模板测试不同,只有通过之后开发者才能指定是否用该片元的深度值覆盖原有缓冲区的深度值。这是通过开启/关闭深度写入做到的。

        合并操作

        通过了所有测试后,片元就来到了合并操作。

每个像素的信息被存储在一个名为颜色缓冲区的地方,因此执行此次渲染时,颜色缓冲区中往往已经有了上次渲染之后的结果。所以需要合并的方式使其达到一种均衡状态。

对于不透明物体,开发者可以选择关闭混合操作。这样片元着色器计算得到的颜色值就会直接覆盖原来颜色缓冲区中的像素值。

对于半透明物体,需要使用混合操作来让这个物体看起来是透明的。

混合操作也是可以高度配置的。开启了混合,GPU会取出源颜色和目标颜色将两者混合。

源颜色是片元着色器得到的颜色,目标颜色是已经存在于颜色缓冲区中的颜色值。

        提前测试

        提前测试的目的主要是为了提高性能

虽然逻辑上这些测试是在片元着色器之后进行的,但对于大多数GPU来说,他们会尽可能在执行片元着色器之前进行这些测试。

尽可能早知道哪些片元会被舍弃可以提高性能,比如unity的渲染流水线中的深度测试就在片元着色器之前。这种将深度测试提前的技术被称为Early-Z技术。

但将这些测试提前其检验结果可能会与片元着色器中一些操作产生冲突。

        至此Unity的渲染管线的大致过程就已经介绍完毕啦~,这是笔者第一次攥写博客部分绘制的流程图和解释还较为粗糙,后续还会继续编写有关Unity的内容,希望能对大家有所帮助(.^◡^.)

        


http://chatgpt.dhexx.cn/article/7ysdJykW.shtml

相关文章

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

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

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

学习笔记(一)渲染管线

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

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

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

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

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

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

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

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

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

如何使用SPSS进行判别分析

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

IBM SPSS Statistics定义变量使用介绍

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

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

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

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

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

SPSS入门教程—相关性分析使用方法

IBM SPSS Statistics为用户提供了三种相关性分析的方法,分别是双变量分析、偏相关分析和距离分析,三种相关分析方法各针对不同的数据情况,接下来我们将为大家介绍如何使用SPSS相关性分析中的距离分析。 一、数据简述 距离分析和其他两类相关…

使用IBM SPSS Statistics的新手应该如何入门

一、什么是IBM SPSS Statistics? IBM SPSS Statistics 是一款强大的统计软件平台,它所提供的数据分析功能,可以帮助企业、个人对各类数据进行切实可行的洞察分析,从而获取有效信息。 二、为什么要进行SPSS数据分析? …

【SPSS】包含多元线性回归、聚类分析、判别分析、主成分、相关系数、非参数秩检验的spss使用方法,含有相关例题,可以解决“数学建模”中数据建模的大部分问题

记录《多元统计分析》关于spss软件的使用,本篇教程不涉及具体模型的推导,通过例题来带领大家入门spss软件,学习软件基本的使用,解决常见数模问题。 本篇所有数据都可以在百度网盘上下载: 链接:https://pan.…

关于SPSS软件的使用

最近由于调研的需要,需要使用spss软件:Statistical Product and Service Solutions,“统计产品与服务解决方案”软件 1.首先是定义变量: 选择左下角“变量视图”,我们调查问卷的每一道题都可以作为一个变量&#xff0c…

spss登录本地计算机,SPSS基本使用

1.定义变量 名称不能用$,后面加.,保留字会歧义,不区分大小写 标签是对变量的补充说明 测量 : 名义:代表不同的类别,不能比较大小。如 性别 度量:可以比较大小 如距离、长度 有序:分类变量(大小之间有等级顺序)如:满意,很满意,不满意。。。。 2.SPSS导入数据库文件时,…