读Unity Shader入门精要第二章-渲染流水线
作者:互联网
1.综述
1.1 什么是流水线
在工业上流水线被广泛应用在装配线上:每一件产品的制造都被分为了很多步骤,每个工人负责其中的一个步骤,且这些步骤之间是有顺序的.
1.2 什么是渲染流水线
在计算机的图像渲染中,产品就是一张二维图像,如何生产这张图像的过程就是渲染流水线.
在<Real-Time Rendering, Third Edition>一书中将渲染流程分为3个阶段:应用阶段(Application Stage)\几何阶段(Geometry Stage)\光栅化阶段(Rasterizer Stage),每个阶段也都包含了一整套的流水线系统.
1.2.1 应用阶段
这个阶段由应用主导,通常由CPU负责完成,有3个主要任务:
1)准备好场景数据,如摄像机的位置\视锥体\场景中包含了哪些模型\使用了哪些光源等;
2)粗粒度剔除:把那些不可见的物体剔除出去以提高性能;
3)设置每个模型的渲染状态,如使用的材质(漫反射颜色\高光反射颜色)\使用的纹理\使用的shader等
最终,这个阶段将渲染所需的几何信息(渲染图元, rendering primitives)输出传递给下一个阶段.这些几何信息可以是点\线\三角面等
1.2.2 几何阶段
几何阶段主要处理所有和我们要绘制的几何相关的事情,如:决定绘制的图元是什么\怎样绘制它们\在哪里绘制它们等.这一阶段由GPU完成.这一阶段最重要的任务是将顶点坐标变换到屏幕空间中,再将屏幕空间的二维顶点坐标\每个顶点对应的深度值\着色等相关信息传递给下一个阶段
1.2.3 光栅化阶段
光栅化阶段主要使用几何阶段传递的信息产生屏幕像素,并渲染出最终的图像.这一阶段在GPU上进行.这一阶段主要任务是决定每个渲染图元中哪些像素应该被绘制在屏幕上.
2.CPU和GPU之间的通信
应用阶段由CPU负责计算,而几何阶段开始则由GPU负责计算,因此,在从应用阶段到几何阶段的过程中,CPU需要将应用阶段计算好的几何数据提交给GPU,这个提交的过程主要有以下3个阶段:
1)将数据加载到显存中;
2)设置渲染状态;
3)调用Draw Call.
2.1 把数据加载到显存中
由于显卡对显存(Video Random Access Memory, VRAM)的访问速度更快,因此需要将渲染所需的几何数据从内存(Random Access Memory, RAM)中加载到显存中.
2.2 设置渲染状态
CPU通过设置渲染状态,可以"指导"GPU如何进行渲染工作.这些渲染状态包括顶点着色器\片元着色器\光源属性\材质等信息.
2.3 调用Draw Call
Draw Call是一个由CPU发起GPU接收的命令,这个命令仅仅会指向一个需要被渲染的图元(primitives)列表,而并不会包含任何材质信息.当给定了一个Draw Call时,GPU就会根据渲染状态和所有输入的顶点数据来进行计算,最终输出成屏幕上显示的像素.
3.GPU流水线
3.1 概述
在GPU负责的几何阶段和光栅化阶段,GPU通过流水线化整个过程,大大加快了渲染速度.GPU的整个渲染过程也可以叫做GPU流水线.
GPU流水线包含以下步骤:
1)顶点着色器(Vertex Shader):实现顶点的空间变换\顶点着色等功能,是可编程的;
2)曲面细分着色器(Tessellation Shader):用于细分图元,是一个可选的着色器;
3)几何着色器(Geometry Shader):被用于执行逐图元的着色操作,或者被用于产生更多图元,是一个可选的着色器;
4)裁剪(Clipping):将那些不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片,这个阶段是可配置的;
5)屏幕映射(Screen Mapping):几何阶段的最后一个流水线步骤.这一阶段负责把每个图元的坐标转换到屏幕坐标系中,是不可编程也不可配置的;
6)三角形设置(Triangle Setup):不可编程也不可配置
7)三角形遍历(Triangle Traversal):不可编程也不可配置;
8)片元着色器(Fragment Shader):实现逐片元的着色操作,是可编程的;
9)逐片元操作(Per-Fragment Operations):光栅化阶段的最后一个流水线步骤,负责一些重要的操作,如修改颜色\深度缓冲\进行混合等,这个阶段不可编程但是可以配置.
3.2 顶点着色器
顶点着色器是流水线的第一个阶段.CPU输入的每个顶点都会调用一次顶点着色器,但是着色器本身不能创建或者销毁顶点,也无法感知其他顶点,因此GPU可以利用本身的特性并行化处理每一个顶点,提高处理速度.
顶点着色器的主要工作有:坐标变换和注定点光照.同时顶点着色器还可以输出后续阶段所需要的数据.
3.3 裁剪
被渲染物体和摄像机的关系有3种:完全在视野外\部分在视野外\完全在视野中.对于完全在视野外的物体,可以直接剔除;对于部分在视野外的物体,则需要进行裁剪,将不再视野内的图元裁剪掉.
3.4 屏幕映射
对于原来顶点的坐标的x和y值,通过缩放映射到屏幕上的二维坐标,对于原来顶点的z坐标,则不会做任何处理,和映射后的屏幕坐标一起构成一个新的坐标并传递给光栅化阶段.屏幕坐标系和被渲染物体的z坐标轴一个构成一个新的坐标系,称为窗口坐标系(Window Coordinates).
3.5 三角形设置
由几何阶段输出的信息是一系列的顶点信息,到了光栅化阶段,就需要填充除了这些顶点之外剩余像素点的颜色信息.
光栅化的第一个流水线阶段就是三角形设置.在这个阶段,我们将根据顶点计算每条边上的像素坐标.这个阶段的输出将给下个阶段做准备.
3.6 三角形遍历
这个流水线阶段将会检查每个像素是否被一个三角形网格所覆盖,如果被覆盖的话,就会生成一个片元(一个像素或多个像素的一系列状态信息).找到哪些像素被三角形网格覆盖的过程就是三角形遍历.
三角形遍历会根据上一个阶段的计算结果来判断一个三角形网格覆盖了哪些像素,并使用三角网格三个顶点的顶点信息对覆盖区域内所有像素进行插值.
这一步的输出是一个片元序列.片元中的信息还不是真正的像素,而是像素的状态集合,如屏幕坐标\深度信息\法线\纹理坐标等.
3.7 片元着色器
片元着色器的输入是上一个阶段输出的片元,输出的结果是一个或多个颜色值.这个阶段是可编程的,可以完成很多重要的渲染技术,如纹理采样等.
片元着色器有一定的局限性.片元着色器只可以影响单个片元,不可以将当前片元的信息发送给其他片元.但是有一个情况例外,片元着色器可以访问到导数信息.
3.8 逐片元操作
这一阶段是渲染流水线的最后一个阶段,主要任务有:
1)决定每个片元的可见性,这包含了许多测试工作,如深度测试\模板测试等;
2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并(或者混合).
这一阶段是高度可配置的,即我们可以设置每一步的操作细节.
标签:渲染,Shader,Unity,片元,阶段,GPU,顶点,精要,着色器 来源: https://www.cnblogs.com/movin2333/p/16534695.html