一、基础渲染管线
学习视频链接:https://www.bilibili.com/video/BV1L54y1s7xw?spm_id_from=333.337.search-card.all.click
开篇第一句先给自己打个气,希望自己可以坚持学习。 渲染管线的作用:就是通过一系列的处理,把场景的3D元素转化为屏幕的2D图像。
渲染流程主要分为以下阶段 1、应用阶段 2、几何阶段 3、光栅化阶段 4、逐片元操作 5、后处理
1、应用阶段
应用阶段主要是在CPU上完成的,
-
准备基本场景数据 包括场景数据。物体变化数据:位置旋转、缩放等;物体网格数据,顶点数据,UV贴图、法线等。 摄像机数据,代表了观察视角。位置、方向、远近裁剪平面、摄像机模式正交或者透视等 光源以及阴影数据。光源的类型,光源的位置,方向等参数 其他全局数据 -
加速算法,粗粒度剔除 准备好上面的渲染的场景对象数据之后,我们还要做一些优化,比如算法上的加速,或者干掉一些看不见的不需要渲染的物体,做一些剔除。可见光的裁剪,可见场景物体的裁剪。 碰撞检测 加速算法 遮挡剔除 其他算法 -
设置渲染状态,准备渲染参数 就是采用什么样的方式去渲染物体 绘制设置,不同的物体我们可能使用不同的shader去渲染,设置不同的合批次方式。 绘制顺序,是由远及近渲染还是先渲染不透明物体,再渲染透明物体等绘制顺序 渲染目标,渲染完成以后,我们要把渲染的结果输出到哪里,是RenderTexture 还是FrameBuffer 渲染模式, 例如unity的前向渲染或者延迟渲染 -
调用drawcall,输出渲染图片到显存 设置好渲染状态以后,我们就会调用drawcall,把带有数据的图元输出到显存上,去交给GPU显示。 顶点数据 其他数据
2、几何阶段
- 顶点着色器(可编程)
空间变换,通过MVP矩阵变换,把物体的顶点从模型空间–世界坐标系下–观察空间–齐次裁剪坐标 顶点顶点着色 - 曲面着色器/几何着色器
可选步骤 曲面着色器是按照一定的规则和算法来生成更多的顶点,将现有的图元和网格细分,变的更加平滑。 几何着色器是基于图元操作的,这个图元可能是一个顶点,也可能是一个线段,也可能是一个三角形,或者其他,它是通过给定的图元去生成更多的图元。 - 投影
正交/ 透视 从3D空间到2D空间的一个转换过程,会在裁剪空间进行一个xyzw的透视除法,对于正交的w=1,这样顶点的位置xyz除完w都不会有变化,就不会有近大远小,而透视w为近小远大。从而把投影坐标系转换到了标准坐标系NDC - 裁剪
视椎体裁剪CVV 正面或背面剔除(可配置) 在裁剪空间以外的,都把他干掉。openGL维度xyz(-1,1) - 屏幕映射
从连续到离散,从三维变到二维 从标准坐标系映射到屏幕坐标系中
3、光栅化阶段
- 三角形设置
计算图元的边界信息 - 三角形遍历
遍历所有像素,检查是否被三角形所覆盖,如果被覆盖,这说明这个片元属于这个三角形,会根据被三角形顶点进行线性差值得到当前的片元数据。 - 抗锯齿
SSAA:渲染到一个分辨率大N倍的buffer,然后对放大N倍的Buffer进行采样 MSAA:在光栅化阶段,计算多个覆盖样本 FXAA/TAA:后处理技术
4、逐片元操作
- 片元着色器
输出片元颜色,根据三角形三个顶点的颜色进行线性插值,类似还可以得到法线,uv信息,深度信息等,然后利用片元数据和其他全局数据,比如光照阴影等等去计算,得到最终的片元颜色 - 颜色混合
透明度测试 透明度小于给定阈值的片元就会被舍弃不渲染 深度测试 深度可以选择覆盖方式 大于小于等于等,也可以设置是否写入深度缓冲区 模板测试 模板测试是比较模板值,也是可以大于小于等于,也可以设置是否写入模板缓冲区 - 混合
同一像素可能有多个片元,对不同片元颜色进行混合,得到最终颜色
|