GPU渲染管线和shader

这里写图片描述
1 几何阶段(顶点shader处理这部分)
模型坐标空间-世界坐标空间-观察坐标空间-屏幕坐标空间

其中从观察空间 到 屏幕空间需要经过3步(CVV单位立方体,规范立方体)

a用透视变换矩阵把顶点从视锥体中变换到裁剪空间(齐次空间,用齐次坐标表示);
b在 裁剪空间进行图元裁剪;(这里就是视域剔除View Frustum Culling),然后齐次空间除w把点转换到CVV中
c屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上

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


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


3光栅化阶段
这里写图片描述
决定哪些像素被集合图形覆盖的过程

光栅化前,图形都是连续的,需要通过光栅化把这些连续的图形转换为屏幕上对应的像素点

光栅化后会进行片段操作(片段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的说明)
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36946274/article/details/81086573