照搬书上的内容+贴图 这样的流水文档没有什么意思,希望能用通俗易懂的语言来记录我每天学习shader之后的总结
什么是渲染流水线?
我的理解:大家应该都了解过流水线,经典流水线(富x康);比如我生产一双鞋,1要做鞋底,2要做鞋面,3要缝合鞋底和鞋面,4要生产挟带,5要系鞋带,如果每个步骤都是1小时,那么一个人生产就要5个小时生产一双,5个人就是5个小时生产5双;那么用流水线来生产呢?一个人只负责一个步骤,如果时间基数够大的话大概一个小时能生产一双,5个小时生产5双,都是生产5双但是效率却拉高了,回到我们的计算机,如果5帧才同步一次界面就会觉得卡,如果1帧同步一次界面这样会觉得流畅,所以我对渲染流水线的理解是它提高了效率,如果流水线分n个步骤那么效率就提高了n倍,而流水线的效率受是最慢的那个步骤所需要消耗的时间影响(不多解释,自己慢慢体会)(如果有不对的地方欢迎指正噢)
(贴个图方便后面讲解)
一.应用阶段:应用顾名思义就我们能操控的,所以这个阶段发生的东西通常(异常情况我还没了解到)是由cpu来实现的所以我们有对这个阶段的绝对主导权
这个阶段要做些什么?
1.首先我们会把需要渲染的数据加载到显存中:把数据从硬盘加载到内存,再从内存加载到显存;为什么要这么做?1.因为渲染的时候GPU一般是没有办法直接访问内存的;2.GPU从显存中获取数据会比从内存中获取速度快很多
什么是数据?不仅仅包含纹理和网格信息,还包含顶点位置,法线方向,顶点信息,纹理坐标等等
2.设置渲染状态:设置这张图片要怎么被渲染出来,例如用什么顶点着色器用什么片元着色器来对它进行渲染、用什么光源属性,用什么材质等
3.调用drawcall:做好上述的准备工作,CPU就说我的工作做完了,这些东西用这个来渲染,哪些东西用那个来渲染,GPU该你来工作了
上面我们已经把准备工作做好了,所以这里只是一个指向的工作,而指向的要渲染的东西是一个渲染列表,就像上面所说的这些,哪些,(我的理解,如果渲染状态是相同的(即材质,光源,顶点着色器,片元着色器相同)那么这里就会进行处理加入到列表中,这样就只用调用一次命令,所以这就是批处理原理?)
CPU快速处理完数据后接着就由GPU来表演了,进入到下一个阶段......
顶点数据-顶点着色器-曲面细分着色器-几何着色器-裁剪-屏幕映射-三角形设置- 三角形遍历-片元着色器-逐片元操作-屏幕图像
几何阶段:首先顶点着色器会先进行工作,把上面传进来的数据进行顶点的空间变换、顶点着色等功能。顶点着色器是开发者可已编程的,就是我们的sharder中一般声明的vert;
什么是坐标变换?坐标变化就是改变顶点的位置,比如水流的上下浮动就可以通过变换顶点的位置来实现模拟水面效果,还要一个更重要的任务,把顶点坐标从模型空间转换到齐次裁剪空间
声明的顶点着色器和片元着色器
把顶点坐标从模型空间转换到齐次裁剪空间
为什么要做这个空间转换呢?
主要是要交给硬件做透视处理,最终得到归一化的设备坐标,这个齐次裁剪坐标空间估计就是我们的视野范围,处理完坐标后会给到下一步裁剪进行处理
顶点着色器处理完后,硬件会对图元进行裁剪工作,所以输入的是图元还是顶点呢?(留有疑惑,后面再回过头来看看)
裁剪完后,会进行屏幕映射操作,书上说这一步的输入仍然是三维坐标系下的坐标(所以以上步骤都是以点为单位进行处理的吗?),这里的任务是把每个图元的x和y坐标转换到屏幕坐标系下,就是三维转换为二维,因为屏幕是一个平面的东西
接下来就进入光栅化阶段了
光栅化主要目标:计算每个图元覆盖了哪些像素,以及为这些像素计算它们的颜色(言外之意,图元并不是像素,应该是比像素要大的一个单位)
光栅化的第一步是三角形设置,应用阶段输出的是三角网格的顶点(即一些点的信息),即我们得到的是三角网格每条边的两个端点。如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。