本章参考:
(1) 优快云:显卡、GPU、CPU、CUDA、显存、RTX/GTX及查看方式
(2)《Unity Shader 入门精要》
一、GPU是什么
1. GPU与CPU
GPU是显卡上的一块芯片,就像CPU是主板上的一块芯片。
2. CPU
可以理解为颜料一个点一个点地先后发射,连接在一起,给人呈现以笑脸的图像,一步步迭代计算,花费时间较长。
3. GPU
多管颜料一瞬间同时发射,直接绘制成一幅完整的画像,大量高并行计算,花费时间是在一瞬间。
比起用三五个强大的微处理器(或者说“管道”)来处理这些信息,用一大堆小的微处理器来并行计算,快得多。这就是图形处理器(GPU : Graphic Processor Unit)的来由,它要求编写一个通用的规则,依据像素的不同位置输出不同的结果。
二、渲染管线
!!! 目的:接受一组3D空间坐标,然后把它们转变为屏幕上的有色平面像素输出。!!!
计算机需要从一系列的三维顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的映射在屏幕上的平面图像。而这个工作通常是由CPU和GPU共同完成的。
其实可以想象屏幕背后是一个真实存在的3D小世界,渲染管线的目的就是将这个世界先压扁变成2D,然后再根据具体的屏幕像素绘制出来。
这个流程主要分为3块阶段:应用,几何,光栅化。
三者的任务流程,通俗点来说就是:
一开始所有每一个渲染单位(渲染图元,可以是点/线/三角面)还只是数据,并没有实际的样子。
这时候在应用阶段会将需要的图元的数据从CPU输送到GPU;
到几何阶段会在GPU中处理每个图元,将其从3D坐标映射到2D坐标。
到光栅化阶段会将2D坐标映射到屏幕的像素,真正地被绘制出来。
如果只是了解这个流程的话,其实看到这里就已经能懂得渲染管线的大致流程了,如果要详细知道每一步中的具体操作,就可以往下看三个阶段更细分的介绍。
1. 应用(CPU):
(剔除屏幕不可见的物体,输出渲染所需要的几何信息给GPU,设置渲染状态,)这些准备工作完成后,就可以通过调用Draw Call来命令GPU进行渲染。
- Draw Call(渲染命令):当数据准备好后,CPU就需要调用一个渲染指令告诉GPU,按照上述设置进行渲染,这个渲染命令就是Draw Call。
---- 得到渲染命令后,以下在GPU进行的 几何 和 光栅化 阶段,合并称为GPU流水线 ----
绿色是可编程的阶段,因此也被称为可编程渲染管线
黄色表示该流水线阶段可以配置但不是可编程的
蓝色是完全固定的
2. 几何(GPU)<投影>:
逐个图元操作,把顶点坐标变换到屏幕空间中。
输出:屏幕坐标系下的顶点位置和其他相关信息。
- 顶点着色器:逐顶点独立调用,主要任务是坐标变换和逐顶点光照
坐标转换:将顶点从 模型空间 转换到 齐次裁剪空间 。 - 曲面细分着色器:用镶嵌化处理技术对三角形进行细分,增加三角面数,让曲面更加圆滑,有助于展现一个细节更加丰富的模型
- 几何着色器:以完整的图元(primitive)为输入,它的主要亮点可以创建或销毁几何图元,且它的拿手好戏就是将一个点扩展为一个四边形(即两个三角形)。
- 裁剪:将不在摄像机视野内的顶点裁剪掉。在视野内的保留,视野外的舍弃,那么比较复杂的就剩下在视野边缘需要部分被裁剪的图元。
- 屏幕映射:每个图元的坐标转换到屏幕坐标系(x、y坐标)。
3. 光栅化(GPU)<筛选>:
产生屏幕上的像素(并决定哪些像素会被绘制)。
两个最重要目标:计算每个图元覆盖了哪些像素;计算这些像素的颜色。
光栅化:图元被转换为多个片元的过程。将连续的几何图元转换为屏幕上的离散像素,是图形渲染中关键的步骤之一。通过光栅化的过程,计算机可以将虚拟世界的图形呈现在屏幕上,使其在显示器上显示。
- 三角形设置:计算图元对应的像素,并确定像素颜色。
之前的计算都是基于单个顶点,而这一步之所以叫做“三角形”设置,就是因为现在开始需要计算三角形网格整个面与像素的对应覆盖关系。而为了做到这一点,在这一步中就需要计算三角形的边界。 - 三角形遍历:检查每个像素是否被一个三角网格覆盖,若被覆盖,就生成一个片元(fragment)。
- 注:虽然一个片元占据的是一个像素的位置,但并不是真正意义上的像素,而是包含了该像素各种状态的集合,这些状态用于计算每个像素的最终颜色。
- 片元着色器:其实也可以叫做“像素着色器”,但是正因为现在还并不是真正意义上的像素,所以“片元着色器”更加合适。该步骤负责输出颜色值。
- 逐片元操作(输出合并阶段):实际操作,决定每个片元的可见性,混合颜色。
当图元经过了上面三个阶段的层层计算和测试后,就会显示到我们的屏幕上!!!