GPU渲染管线与shader

1、几何阶段(顶点shader处理这部分)

模型坐标空间 - 世界坐标空间 - 观察坐标空间 - 屏幕坐标空间
其中从观察空间到屏幕空间需要经过3步(CVV单位立方体,规范立方体)
a、用透视变换矩阵把顶点从视锥体中变换到裁剪空间(齐次空间,用齐次坐标表示);
b、在裁剪空间进行图元裁剪;(这里就是视域剔除View Frustum Culling),然后齐次空间除w把点转换到CVV中
c、屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上

GPU渲染管线与shader

顶点着色程序从GPU 前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。

2、图元装配

就是处理顶点连接关系(这里会进行背面剔除Back-Face Culling,以减少顶点)

3、光栅化阶段

GPU渲染管线与shader

决定哪些像素被集合图形覆盖的过程
光栅化前,图形都是连续的,需要通过光栅化把这些连续的图形转换为屏幕上对应的像素点

光栅化后会进行片段操作(片段shader处理这部分)
a、遮挡剔除,消除遮挡面
b、纹理操作Texture operation
c、混合 blending,透明处理
d、滤镜或滤波 filtering ,一种颜色经过某种滤波或滤镜处理后再输出
这里特殊说明下,unity shader 的surf 和自定义光照部分都是在这里处理的,surf可以处理纹理,而光照在几何阶段猜测只是记录光照数据,这里计算光照对颜色的影响

光栅化过程用到的4个缓冲

1. 深度缓冲区 z buffer 保存顶点深度
2. 模板缓冲区 stencil buffer 保存顶点是否处于阴影体内的标识,有的说模板缓冲室深度缓冲的一部分
3. 帧缓冲区 frame buffer 存储深度缓冲和颜色缓冲的混合
4. 颜色缓冲区 color buffer

另外最后会进行个视口裁减

片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。

片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU 而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序

片断和像素有什么不一样?所谓片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。

每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。

unity shaderlab中AlphaTest的位置是在fragment函数之后可以阻止最终渲染到帧缓存,StencilTest是在fragment之前可以阻止fragment函数执行,下图Culling DepthTest是深度测试(不包括SencilTest的说明)

GPU渲染管线与shader

转自: jaccen的专栏

--电子创新网--
粤ICP备12070055号