Unity Shader学习笔记——渲染流水线

        渲染流水线可以分为三个概念阶段:应用阶段、几何阶段、光栅化阶段。

应用阶段:通常在CPU上实现完成,主要由开发者来操控,执行的三个主要任务就是:     

        1 .准备好场景数据,例如摄像机的位置,使用了哪些光源

        2.粗粒度剔除,将那些不可见的物体剔除出去,就不需要移交几何阶段来处理

        3.设置好每个模型的渲染状态,输出渲染所需要的几何信息(即渲染图元)

几何阶段:通常在GPU上运行,处理所有我们要绘制几何相关的信息,进行逐顶点、逐多边形的操作。几何阶段一个重要任务就是将顶点坐标变换到屏幕空间中,再交给光栅器处理。

光栅化阶段:也通常在GPU上运行,通过上一阶段传递的数据产生在屏幕上的像素,并渲染出最终的图像。

        这里的流水线是概念流水线,只是渲染流程基本功能划分,下面要介绍的GPU流水线才是硬件用于实现上述概念的流水线。

        渲染流水线的起点是CPU,即应用阶段,大致分为以下三个阶段:

        1.把数据加载到显存中(硬盘>系统内存>显存,于是在渲染中GPU可以快速访问这些数据)

        2.设置渲染状态(定义场景中的网格是怎么样被渲染的,包括顶点着色器、片元着色器,光源属性和材质)

        3.调用drawcall (drawcall其实就是CPU对GPU的一次调用,drawcall的优化是性能优化的重点之一)


        调用drawcall之后就来到了GPU的渲染流程,我们虽然无法完全控制这部分的实现细节,但是GPU还是向我们开放了很多的控制权:

几何阶段:

        顶点着色器:是可完全编程的,计算顶点的颜色,以及坐标转换。(通过改变顶点位置模拟水面)

        o.pos = mul ( UNIYT_MVP , v.position );

        这行代码功能就是把顶点坐标转换到齐次裁剪坐标系下。

        曲面细分着色器:可选的着色器,用于细分图元。

        几何着色器:可选着色器,用于执行逐图元着色操作,或者被用于产生更多的图元。

        裁剪:可配置的阶段。将那些不在摄像机视野范围内的顶点剪裁掉,并剔除某些三角图元的面片。

        一个图元与摄像机视野关系可能有三种情况:完全在摄像机视野内、部分在视野内、完全在视野外。完全在视野内就继续传给下一个流水线阶段,完全在视野外就不会继续向下传递,而部分在视野内就需要经过裁剪处理,将出视野范围的交界处用一个新的顶点,来代替出视野范围的顶点。

        屏幕映射:将每个图元的坐标转换到屏幕坐标系中,通过比例转换屏幕坐标。

        屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。

         如果发现得到的屏幕是倒转的,可能是因为OpenGL和DirectX的屏幕坐标系差异。

光栅化阶段:

        三角形设置三角形遍历都是固定函数的阶段。

        片元着色器:可完全编程,为每个可见片元进行着色操作。

        纹理采样:将纹理像素转为像素。

        逐片元操作:它不是可编程的,但具有很高的可配置性。负责修改颜色、深度缓冲、进行混合等操作。(就是之前渲染流程写到的三个测试和Blend流程)

        1.进行测试工作,例如Alpha测试、模板测试(可用于渲染阴影、轮廓渲染)、深度测试,将不通过的片元舍弃。

        2.如果一个片元通过了所有测试,就将这个片元的颜色值和已经储存在颜色缓冲区的颜色进行合并混合。(不透明物体可以通过关闭Blend操作实现,这样就会直接覆盖掉颜色缓冲区的像素值;如果是把半透明物体,我们就需要使用混合操作让这个物体看起来是透明的)

        逻辑上来说这些测试是在片元着色器之后进行的,但对于大多数GPU来说为了不让计算片元颜色之后未通过测试而被舍弃,会尽可能在执行片元着色器之前就进行这些测试,这种将深度测试提前的技术被称为Early-Z技术,

        通过测试之后,就会显示到我们的屏幕上,但是为了避免我们看到那些正在光栅化的图元,GPU会使用双重缓冲的策略,对场景的渲染是在幕后发生的,即后置缓冲,一旦场景已经被渲染到了后置缓冲中,GPU就会交换后置缓冲和前置缓冲的内容,前置缓冲区是之前显示在屏幕上的图像。

猜你喜欢

转载自blog.csdn.net/weixin_45081191/article/details/129161550