第二章 渲染流水线(上)---GPU流水线


一.概念性阶段
应用阶段(Application Stage)->几何阶段(Geometry Stage)->光栅化阶段(Rasterizer Stage)

1.1 应用阶段
目标是输出渲染所需要的几何信息,即渲染图元(rendering primitives)。
1.1.1 准备场景数据,例如摄像机位置,视锥体,场景中包含哪些模型,使用哪些光源等。
1.1.2 粗粒度剔除(culling),把不可见物体剔除出去,这样就不需要再移交给几何阶段处理了。
1.1.3 设置模型渲染状态,包括它使用的材质 (漫反射颜色,高光反射颜色),使用的纹理,使用的Shader等。  

1.2 几何阶段
目标是输出屏幕空间的二维顶点坐标,每个顶点对应的深度值 ,着色等相关信息,并传递给下一阶段。

1.2.1 几何阶段负责和每个渲染图元打交道。决定需要绘制的图元是什么,怎么绘制 它们,在哪里绘制 它们。这一阶段通常在GPU上进行。
1.2.2 几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。

1.3 光栅化阶段
这一阶段会使用上一阶段传递的数据来产生屏幕上的像素,并渲染出最终图像。
主要任务是对上一阶段得到的逐顶点数据(如纹理坐标,顶点颜色)进行插值 ,然后再进行逐像素处理。

二.GPU 流水线

2.1 顶点着色器(Vertex Shader)
完全可编程。实现顶点的空间变换,顶点着色功能。主要工作有:坐标变换和逐顶点光照。

本身不可以创建或者销毁任何顶点,并且无法得到顶点与顶点间的关系。例如,我们无法得知两个顶点是否属于同一个三角网格。
一个最基本的必须完成的工作是:把顶点坐标从模型空间转换到齐次裁剪空间。o.pos  = mul(UNITY_MVP,v.position);接着通常再由硬件做透视除法后,最终得到归一化的设备坐标(Normalized Device Coordinates,NDC)


2.2 曲面细分着色器
是一个可选的着色器,用于细分图元。
2.3 几何着色器
可选着色器。可以被用于执行逐图元的着色操作
2.4 裁剪(Clipping)
可配置。
将不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片。
使用NDC载剪。

2.5 屏幕映射(Screen Mapping)
不可配置和编程。 负责把每个图元的坐标转换到屏幕坐标系中。
屏幕坐标系是一个二维坐标系,它和我们用于显示画面的分辨率有很大关系。

屏幕映射不会对输入的z坐标做任何处理。实际上屏幕坐标和z坐标构成了一个坐标系,叫做窗口坐标系。这些值 会一起被传递到光栅化阶段。

2.6 三角形设置
计算三角形风格表示数据的过程叫三角形设置。
2.7 三角形遍历
检查每个像素是否被一个三角形网格所覆盖,如果被覆盖,就会生成一个片元(fragment)。找到哪些像素被三角形网格覆盖的过程,就叫三角形遍历。
同时,三角网格的3个顶点信息对整个覆盖区域的像素插值。
片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。

2.8 片元着色器
完全可编程,进行逐片元的着色操作。
此阶段完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元纹理坐标了。

它的局限在于,它仅可以影响单个片元,也就是说执行片元着色器时,它不可以将自己的任何结果直接发送给它的邻居们(片元着色器可以访问到导数信息)。

2.9 逐片元操作
负责执行很多重要操作,如修改颜色,深度缓冲,进行混合。不可编程,但有很高的可配置性。
是真正对像素产生影响的阶段。之前都是影响的片元(一系列数据)。

主要任务:
2.9.1 决定每个片元的可见性,涉及很多测试工作,例如深度测试,模板测试等。
2.9.2 将这个片元的颜色值和已经存储在颜色缓冲区中的颜色合并,或者说混合。



你可能感兴趣的:(Unity,Shader,入门精要笔记)