一、渲染管线的流程
1.渲染简单理解:
就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或
Tips:在介绍渲染管线之前,先全局了解一下整个渲染引擎。这里借鉴了知乎大佬游戏君五尘的一
篇文章渲染管线----通俗易懂向面试官介绍 (qq.com)
整个渲染分为五个阶段,如图一:工具阶段,资产调节阶段,应用阶段、几何阶段,光栅化阶段
渲染引擎:对各种模型进行染色、光照、阴影等渲染,绘制出屏幕画面的功能模块。
那么我们来了解一下每个阶段都
工具阶段:制作模型(鬼话版:定义几何和表面特性)
资产调节阶段:转换模型格式(处理几何和材质)
应用程序阶段:为渲染管线做准备。准备要渲染的模型(网格)
几何阶段:处理网格顶点数据,转成屏幕空间的顶点信息
光栅化阶段:着色,输出最终效果
二、渲染管线的介绍
渲染管线:严格来讲,是GPU处理数据生成图像的整个过程!
渲染流程:图像绘制的流程。CPU和GPU一起完成的。但是不可否认,CPU也是整个过程必不可少的,所以把它加上。变成这样。
GPU渲染管线流程图演示
简单概述:1. 渲染管线就是一堆原始图形数据经过各种变化处理最终出现在屏幕的过程。
1.渲染管线特点
1. 前一阶段输出作为下一阶段输入
2.可以并行执行
三、应用阶段
准备场景数据、粗粒度剔除、设置渲染状态、调用Drawcall
1.准备场景数据:
1.物体变换数据(缩放旋转平移)、物体网格数据(顶点位置、UV贴图)
2.光影数据(光源类型,位置、方向、角度)、是否需要阴影(判断光源可见范围内是否有可投影物体)、阴影绘制方式(逐级联、逐光源)
3.相机数据(位置、远近平面、正交or透视、视口比例、尺寸)
2.粗粒度剔除:
1.主要是对可见物体进行裁剪,包括但不限于:八叉树算法、BSP树、K-D树、BVH包围核
3.设置渲染状态:
1.绘制的设置(使用什么shader、合批的方式)
2.绘制的顺序(相对相机距离绘制、材质RenderQueue、根据UICanvas绘制等)
3.渲染的目标(帧缓存orRenderTexture)
4.渲染的模式(前向渲染or延迟渲染)
3.4 前向渲染与延迟渲染 - 知乎 (zhihu.com)
4.调用Drawcall
CPU对GPU进行沟通,指定被渲染的图元
主要输出顶点数据(位置、颜色、法线、UV坐标)、其他数据(MVP矩阵、纹理贴图等)
5.简单描述应用阶段做的三件事
可见性判断:仅提交可见物体给GPU
提交几何图元:提交网格、材质等数据,建立GPU命令表
控制着色器参数: uniform
四、几何阶段
1.顶点着色器_顶点数据的输入:
进行顶点坐标变换。将输入的模型空间顶点坐标变换到裁剪空间顶点坐标
2.视图变换
(模型空间—(模型变换M)—世界空间—(视图变换V)—观察空间—(投影变换P)—裁剪空间—(视口变换‘正交、透视、裁剪都在这一步进行’)—视口空间) 本质就是通过屏幕映射将其次空间下裁剪坐标转为屏幕坐标。(MVP矩阵)
3.顶点处理(可选)
曲面细分:(将三角形分成多个三角形,可选)
几何着色器:(将顶点分成线或多边形,可选)
图元装配:将顶点装配成指定的图元的形状(三角形)
4.投影
简述:根据摄像机类型(正交或者透视)转化到归一化设备坐标系!
详细:我们需要在这步将投影坐标系转化为标准坐标系(NDC),因此要做一个透视除法,将x、y、z、w的值都除以w以完成投影操作,而透视投影和正交投影会在此步出现差异
正交投影中,w=1 所以x、y、z同时除以w后无任何变化,这就造成了正交投影中,我们看到的远近大小一样
透视投影中,w不等于1,近大远小,所以进行透视除法后会造成我们看到近小远大的情况。
5.裁剪
简述:超出屏幕的不用渲染!
详细:我们在进行透视除法后,如果这个点x、y、z不在[-1,1]中,则会被裁剪掉,如果部分在内,部分在外,则会在裁剪时进行补全,而这一步在OPENGL和DX中出现了差异,在OPENGL中 x、y、z的值在[-1,1]中,而在DX中 x、y的值在[-1,1]中,而z的值在[0,1]中
6.剔除
简述:背面的点不用渲染
7.屏幕映射
简述:从-1到1的投影坐标系,映射到正式的屏幕的坐标位置。
详细:通过屏幕映射将其次坐标空间下裁剪坐标(NDC)转为屏幕坐标
这一步在OPENGL和DX中也出现了差异(主要是由于左右手坐标系)
OPENGL的原点在左下角
而DX的原点在左上角
五、光栅化阶段
1.光栅化:
将图元映射为最终屏幕上显示的颜色
2.片段着色器:
计算每个像素的最终颜色,对顶点插值,得到颜色值
3.逐片元操作:
决定了每个片元的可见性,如果通过测试,就把颜色值和缓冲区的颜色值进行合并(混合)逐片元操作的流程:像素所有权测试→裁剪测试→透明度测试→模板测试→深度测试→透明度混合
深度测试和混合阶段:判断像素的遮挡关系和透明度,决定是否应该丢弃和怎么显示。
4.三角形设置
已知三角形的顶点位置,如何知道他所覆盖的屏幕像素、计算这个图元的边界信息的过程就是三角形设置
5.三角形遍历
简述:根据顶点信息,输出三角形覆盖的像素位置
通过三角形设置这步得到边界信息后,遍历所有相关像素,找出所有三角网格所覆盖像素的过程就是三角形遍历
6.抗锯齿
在采样之前先做一个模糊(过)
SSAA(Super-Sampling Anti-Aliasing——超级采样抗锯齿):把图片放进缓存并放大,把放大后的图像像素采样临近2个或4个像素,混合,生成的最终像素,令图形的边缘色彩过渡趋于平滑,最后把图像还原回原来大小。缺点:很吃性能
MSAA(multi-sampling anti-aliasing——多重采样抗锯齿):MSAA是SSAA的一种优化版本,MSAA只对物体边缘部分的像素进行超采样,然后缩放还原处理,不过只处理需要”抗锯齿“的部分,所以性能比SSAA高。MSAA只对zbuffer和stencilbuffer中的数据进行超采样抗锯齿处理,因为这两个buffer可以得到点线面之间的z深度和遮挡关系,所以使用算法可以得到边缘像素并处理。MSAA是三维图形中常用的抗锯齿算法。
FXAA(full scene anti-aliasing——快速近似抗锯齿):FXAA的原理就是使用边缘检测滤波器处理屏幕纹理,然后将边缘像素用高斯滤波器进行加权混合,达到查找边缘并混合模糊的目的。后期图像处理,和采样无关!
TXAA(Temporal Anti-Aliasing——时间性抗锯齿):复用上一帧感知到的结果
六、简单描述渲染管线
1. 渲染管线就是一堆原始图形数据经过各种变化处理最终出现在屏幕的过程。
渲染管线可分为三个阶段,应用程序阶段,几何阶段,和光栅化阶段
2. 应用程序阶段由CPU主要负责。CPU将GPU渲染需要的灯光、模型准备好,并设置好渲染状态,为GPU渲染做好准备。
3. 几何阶段把输入的3D数据转换成2D数据。包括顶点着色器、图元装置、裁剪和屏幕映射几个过程。
顶点着色器主要进行顶点坐标变换。将输入的模型空间顶点坐标变换到裁剪空间顶点坐标。
图元装配将顶点装配成指定图元的形状。
几何着色器改变图元。通过产生新顶点构造出新的图元来生成其他形状。
4. 光栅化阶段把图元映射为最终屏幕上显示的颜色。包括光栅化,片段着色,深度测试和混合。
光栅化将顶点转为屏幕上的像素。
片段着色器计算每个像素的最终颜色。
深度测试通过深度信息判断像素的遮挡关系。
混合阶段通过透明度将像素进行混合。
5. 最终渲染好的颜色先被送入后置缓冲,随后再替换前置缓冲,显示在屏幕上。