学习笔记(一)渲染管线

article/2025/7/24 11:34:40

目录

前言

一些疑问

一、什么是渲染管线?

二、为啥这玩意是个流水线?

1.CPU与GPU

2.CPU和GPU数据交互

3.CPU和GPU并行工作

Step1.应用程序阶段(The Application Stage)

一、把数据加载到显存中。

二、设置渲染状态。

三、调用Draw Call

Step2.几何阶段(The Geometry Stage)

一、顶点着色器

二、曲面细分着色器(可选)

三、几何着色器(可选)

四、裁剪

1.视锥体裁剪

2.面剔除(Face culling)

五、屏幕映射

Step3.光栅化阶段(The Rasterizer Stage)

一、三角形设置

二、三角形遍历

三、片元着色器

四、逐片元操作


 

前言

最近两个月学完了乐乐女神的shader精要和闫佬的101,也对学的东西有了一点点点点的初步理解,故此整理一下,也方便记忆,很多地方理解不深,如有错处,恳请各位大佬不吝赐教。

一些疑问

一、什么是渲染管线?

渲染管线,也作渲染流水线。

初次听起来一副晦涩难懂的样子,实际上就是将3D信息的一些数据递给GPU,最后得出一张二维图像的过程。

简单来说,就是将你游戏里的场景渲染到你的屏幕上的过程。

在TRT一书中将渲染流程分为了:应用阶段(Application Stage )、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)。

 

2838dbe56e2523aac650c8bcb425256a.png

二、为啥这玩意是个流水线?

上面说过的三个阶段,其实是给渲染流程进行基本功能划分为提出来的,真正的流水线是实现在硬件GPU上。

提到GPU,就不得不提到CPU。

1.CPU与GPU

b3f8dabd17bb4c5d21353b471ae4047d.png

*黄色为控制器,绿色为算术逻辑单元,橙色用于存储信息。

*CPU的流水线比较长,计算趋于线性执行(可部分并行),基本上只能处理一件事,但是处理的手法可以是相当精细,像是名艺术家,今天雕塑明天画画,每件事都有自己独立的逻辑,很难并行。

*GPU的流水线较短,内部集成了大量ALU,又可以并行执行,所以可以进行大量可并执行的数学计算,像是饭店里的切菜工,管你是什么品质什么形状的土豆,先给你一刀再说。于是这种对一批数据进行一样的计算,就形成了并行结构的基础。

如图所示,GPU的计算模块要比CPU大,而控制模块要小很多,正是这种比较确定的计算流程导致的。

看完GPU和CPU结构区别之后也就初步简单了解为什么渲染可以是流水线,以及渲染选择专门的硬件而不是用CPU来算。

2.CPU和GPU数据交互

在程序开始运作的时候,所有的数据都存储在磁盘上。程序开始,为了CPU能够快速访问,需要先将数据载入内存(RAM)。所有的渲染工作都集中在GPU执行,所以需要计算的资源也都必须载入显存中(VRAM)。

当然,GPU在进行计算获取数据的时候,并不是直接从显存中获取数据,而是经过多级缓存后,经过对应的寄存器(Register),最后进入ALU中进行计算。

同理当GPU完成对数据的计算之后,会经过寄存器—L1级缓存—L2级缓存然后保存在显存中,最终显示器获取显存中的数据进行显示输出。

3.CPU和GPU并行工作

在Unity Shader精要(后面以精要代称)里面介绍CPU和GPU实现并行工作是采用命令缓冲区(Command Buffer)的方法。

cf07d3d38fa03f40cef99ea7ce326c27.png

命令缓冲区包含了一个命令队列,由CPU添加命令,GPU读取命令,添加和读取是相互独立的,命令缓冲区的存在使得CPU和GPU可以互相独立工作。

如果没有流水线化,那么CPU需要等到GPU上一个渲染任务完成才能再次发送渲染命令。

Step1.应用程序阶段(The Application Stage)

应用程序阶段一般是图形渲染管线概念上的第一个阶段,这一阶段完全由开发者主导,通常由CPU负责实现。

这个阶段比较好理解,比如做了一款游戏,其中的碰撞检测,动画,剔除,几何形变,加速算法等等,把这些该计算的都计算完了之后,在这个阶段的末端,将这些计算好的数据(法向量,纹理,顶点)传入下一个阶段。

其中剔除有:视锥剔除(Frustum Culling),遮挡剔除(Occlussion Culling),层级剔除(Layer Culling Mask)。

 

这个过程在精要中分为三步:

一、把数据加载到显存中。

这个过程就是将上面所述的数据加载到显存中。

*注意:一般情况下,数据加载到显存上就可以将RAM的数据移除了,但实际情况中,CPU仍然需要访问一下数据(例如访问网格数据进行碰撞检测),这是我们就不希望RAM中的数据被移除,因为从硬盘加载到RAM的过程是很耗时的

二、设置渲染状态。

  • 定义场景中的物体网格被怎样渲染,使用了哪个顶点着色器(VertexShader)/片元着色器(Fragment Shader)、光源、材质。
  • 渲染的顺序(Queue,Distance,UICanvas)
  • 渲染模式(Forward/Deferred)

三、调用Draw Call

  • DrawCall的含义十分简单,就是CPU调用图像编程接口。
  • DrawCall就是一种命令,由CPU发起,GPU接收。
  • 调用DrawCall就通知GPU开始根据传输的数据和渲染状态进行渲染。

Step2.几何阶段(The Geometry Stage)

几何阶段主要负责大部分多边形操作和顶点操作,如:顶点坐标变换、顶点着色、裁剪、投影以及屏幕映射,这个阶段主要在GPU上进行运算。

43fd11298cf26e46cdca6903005e0907.png

fc76a6586be86283c4cf3db2fda6d9ad.png

一、顶点着色器

顶点着色器是完全可编程的阶段,专门处理传入顶点信息的着色器,通常,顶点着色器将顶点从模型空间(Model Space)变换齐次裁剪空间(Homogeneous Clip Space),并且一个顶点着色器至少且必须输出此变换位置。

顶点着色器主要工作为:坐标变换和逐顶点光照。

其中这个变换也就是我们常说的MVP矩阵变换。

5b3a6079b0cd937077ed98428ea3aea3.png

*注意:

那么我们的问题也来了,为啥要这么麻烦去变换顶点坐标?

在精要书中解释的很好,直接贴书中内容了。

e82b5bde7e913ab241deb1261fba23ff.png

根据顶点坐标变换的先后顺序,主要有下图几个坐标空间:模型空间(Model Space)有时也被称为(Object Space)、世界空间(World Space)、观察空间(View Space)、裁剪空间(Clip Space)、屏幕空间(Screen Space)

714706d384c0b8dc03b40b6debb22b81.png

以下过程均以缩写代替(例如Object to World = O2W)

O2W:首先,模型空间中的坐标值是模型在建立之初就存在的,比如一个MAX文件,里面包含的数据就是Object Space的自身坐标,和World Space不同,没有和其他物体任何的参照关系。

World Space坐标的实际意义就是有了一个坐标原点,物体和原点进行比较之后知道自己的位置,在Unity中导入一个模型,它的Transform就是世界坐标。

而这一过程,就是将模型空间的坐标值转换为世界空间的坐标值。

W2V:观察空间其实就是摄像机空间,以摄像机为原点,由视线方向、视角和远近平面组成。

那么从世界空间到观察空间这个变换过程被称为观察变换。

 

回到顶点着色器,如果需要的话,在顶点着色器中还可以计算和输出顶点的颜色。

二、曲面细分着色器(可选)

对三角面进行细分操作,增加面数,由外壳着色器(Hull Shader),镶嵌器(Tessellator)和域着色器(Domian Shader)构成(了解不是很深入,止步于认识这些名词)。

三、几何着色器(可选)

  • 输入是一个单独的类型:点、线段、三角形。
  • 几何着色器可以改变新传递进来的图元拓扑结构,且能接受任何拓扑类型的图元,但只能输出点、折线(Line Strip)和三角形条(Triangle Strips)。
  • 几何着色器需要图元作为输入,在处理过程中他可以将这个图元整个丢弃或者输出一个或更多的图元。(也就是说它可以产生比它得到的更多或更少的顶点。)
  • 当我们没有添加几何着色器的时候,默认直接输出三角形,添加之后可以修改输出我们想要的图形。

四、裁剪

1.视锥体裁剪

这一步就是剔除那些不在视锥体范围的物体。

9fb8346ff76fbdec2d84a0db6b332d5a.png

这也正是View Space到Clip Space的过程中的一步。

V2C:观察空间转换到裁剪空间的过程其实就是一个裁剪、投影的过程。因为在不规则的视锥体内裁剪比较困难,所以一般到这一步需要将视锥体转换成一个立方体,而这个立方体被称为规范立方体(CVV),如果是物体的一部分不在视锥体内,那么产生新的顶点去代替。

*注意:

经过透视投影和透视除法之后,这个立方体叫做CVV(Canonical View Volume),而这个立方体所处的坐标系叫做归一化的设备坐标(Normalized Device Coordinates,NDC)。

2.面剔除(Face culling)

接下来会将所有背面朝向的面剔除掉,只要面被挡住了,就会被剔除(可设置)。

 

当进行裁剪和面剔除之后,可以减少进入光栅化阶段的图元数量,这个过程我们也可以称作为图元装配(Primitives Assembly)。

五、屏幕映射

这一步也就是将前面产生的图片坐标信息,映射到屏幕坐标系中。

屏幕映射得到的坐标确定了顶点所在的像素位置。

 

那么之前的CVV是三维坐标系,而屏幕是二维坐标系,那么映射后的Z坐标到哪去了呢?

实际上,屏幕坐标系和Z坐标构成了一个叫做窗口坐标系(Window Coordinates),这些值会被一起传递给光栅化阶段。

需要注意的是,屏幕坐标系在OpenGL和DirectX之前存在差异,OpenGL原点在左下角,DX在左上角。

 

在Unity里面,和上面应用阶段准备的碰撞检测、视锥剪裁数据一样,裁剪空间到屏幕空间的转换是底层帮我们自动完成的。

 

到了这一步,我们几何阶段也就差不多完成了,输出屏幕空间下的顶点信息(法线、深度等)。

Step3.光栅化阶段(The Rasterizer Stage)

一、三角形设置

  • 把前面接受到的顶点信息连线组成三角形,得到三角网格的信息(计算边的像素坐标)。

二、三角形遍历

  • 检查每个像素是否被三角形网格覆盖,被哪一个三角形网格覆盖。如果被覆盖的话,就会产生一个片元(Fragment)。
  • 至此,图元/片元装配过程结束。
  • 这不过这一步得到的片元虽然是以像素点为单位,但它并不是真正最终的像素,而是一个很多信息的集合,包括了屏幕坐标,深度信息,顶点信息,纹理坐标等,这些信息用于后面计算每个像素的最终颜色。

三、片元着色器

  • 片元着色器和像素着色器属于同一个东西,只是在Open GL和DirectX中的叫法不同。
  • 片元着色器是可编程的。
  • 片元着色器并不会影响像素的颜色,而是产生一系列数据信息,用来描述三角形网格是怎么覆盖每个像素的,每个片元负责储存这样一系列数据。
  • 片元着色器的输入是上一个阶段对顶点信息插值得到的结果,而他的输出是一个或多个颜色值。

40ea74bc079af30b5e30ea96e7abd10b.png

  • 这一阶段可以应用很多渲染技术,比如纹理采样。

四、逐片元操作

  • 逐片元操作(Per-Fragment Operations)和输出合并(The Merging Stage )是一个东西,还是OpenGL与DirectX的叫法区别。
  • 逐片元操作是可高度配置不可编程
  • 在这个阶段中,是真正会对像素产生影响。
  • 这个阶段也就是进行模板缓冲 (Stencil-Buffer)和 Z 缓冲(Z-buffer)操作的地方,什么透明处理(Transparency)和颜色混合(Color Blending)也都是在这个阶段进行的。

首先,这个阶段的任务是决定片元的可见性。只不过这个过程比较复杂,不同图形接口也不一样,精要书中给了两个流程图。

043234cb27ed2b7386b33c2777d09bd8.png

之后对于通过的片元,将他们的颜色和缓冲区已有的颜色进行混合,输出到最终的屏幕上。

而这一阶段的流程为:透明度测试,模板测试,深度测试,混合。

最后,理解了渲染管线对学习shader有很大帮助,因为shader所在的阶段就是渲染流水线的一部分。

 

参考书籍:《Unity Shader 入门精要》

 


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

相关文章

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

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

渲染基础-渲染管线(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导入数据库文件时,…

spss安装使用

1.下载spss24 百度云链接如下: 64位安装包:https://pan.baidu.com/s/19_nW1eJh5HN8Q_PAEUzfTg 提取码:l5fc 32位安装包:https://pan.baidu.com/s/14wga9CrNnysTImOaO6JW-Q 提取码:ayl5 安装教程下载&#xff…

SPSS使用命令语法之复制与粘贴讲解

在繁杂的数据中,我们常常束手无策,很难精准地完成数据统计和数据分析,但是IBM SPSS Statistics可以很好地协助我们完成这些工作。 IBM SPSS Statistics 作为一个强大的统计软件平台,不仅可以通过用户友好型界面,分析目…

spss使用教程

描述性统计结果 步骤从上到下 分析描述统计描述 制作矩阵散点图 4. 图形 5. 旧对话框 6. 散点图/点图 7. 矩阵散点图 求相关系数和p值

minecraft编程java_Minecraft编程基础课程(一)

《minecraft》(《我的世界》)是一款风靡全球的高自由度沙盒游戏,整个游戏没有剧情,玩家在游戏中自由建设和破坏,透过像积木一样来对元素进行组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市,玩家可以通过自己创造…

2022年01月世界编程语言排行

2022年01月世界编程语言排行 2022年1月TIOBE指数 一月标题:2021年度Python编程语言 Python赢得了久负盛名的TIOBE编程语言奖。祝贺!这是连续第二次。该奖项授予一年内获得最高收视率增长的编程语言。C#在历史上第一次获得了这个头衔,但Pyt…

2021年8月世界编程语言排行

2021年8月TIOBE索引8月标题:数据挖掘和人工智能语言在TIOBE索引中蓬勃发展 数据来源 注意:2021年6月排名见此篇博客 注意:2021年7月排名见此篇博客 智能手机是许多年前的新宠。因此,用于编写移动应用程序的编程语言也…

《我的世界》Python编程入门(10)模块与“挖宝藏”游戏

一、模块概述 1.1 模块 模块是Python组织、封装代码的一种形式。在Python中,一个.py文件就称之为一个模块(Module)。 创建模块的优点: 大大提高了代码的可维护性。便于复用代码。避免函数名和变量名冲突。 创建模块的注意事项…