Shader学习笔记——GPU流水线

(应用阶段)-> 顶点数据,【顶点着色器,曲面细分着色器,几何着色器,裁剪,屏幕映射】(几何阶段),【三角形设置,三角形遍历,片元着色器,逐片元操作】(光栅化阶段),屏幕图像

 

顶点着色器(Vertex Shader):把顶点坐标从模型空间转换到齐次裁剪空间。o.pos = mul(UNITY_MVP,v.position)

再由硬件做透视除法,最终得到归一化的设备坐标(Normalized Device Coordinates , NDC)。

Shader学习笔记——GPU流水线_第1张图片

裁剪(Clipping):完全在视野内,传递给下一个流水线阶段;部分在视野内,进行裁剪处理;完全在视野外,剔除。裁剪是硬件上的固定操作,不可编程,但是可自定义一个裁剪操作进行配置。

 

屏幕映射(Screen Mapping):把每个图元的x和y坐标转换到屏幕坐标系(Screen Coordinates)。屏幕映射不会对输入的z坐标做处理,屏幕坐标系和z坐标一起构成了一个坐标系,叫做窗口坐标系(Window Coordinates)。这些值会一起被传递到光栅化阶段。屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。(注意:OpenGL把屏幕的左下角当成最小的窗口坐标值,而DirectX则定义了屏幕的左上角为最小的窗口坐标)。

Shader学习笔记——GPU流水线_第2张图片

开始进入光栅化阶段:计算每个图元覆盖了哪些,以及为这些像素计算它们的颜色

三角形设置(Triangle Setup):计算光栅化一个三角网格所需的信息。

三角形遍历(Triangle Traversal):检查每个像素是否被一个三角网格覆盖。如果被覆盖的话,就会生成一个片元。输出一个片元序列。

片元:不是真正意义上的像素,而是包含了很多状态的集合,用于计算每个像素的最终颜色。这些状态包括每个像素的屏幕坐标、深度信息,以及其他从几何阶段输出的顶点信息如法线,纹理坐标等

片源着色器(Fragment Shader):DirectX中称为像素着色器(Pixel Shader)。输入是上一个阶段对顶点信息插值得到的结果。输出是一个或者多个颜色值。这一步完成很多重要的渲染技术如纹理采样。

纹理采样(texture sample):

逐片元操作(Per-Fragment Operations):DirectX中称为输出合并阶段(Output-Merger)。

1.决定每个片元的可见性,深度测试、模板测试等;

2.如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色的缓冲区中的颜色进行合并(混合);

Shader学习笔记——GPU流水线_第3张图片

模板测试(Stencil Test):首先读取(使用读取掩码)模板缓冲区(Stencil Buffer)该片元位置的模板值,然后将该值和读取(使用读取掩码)到的参考值进行比较,比较函数可以由开发者指定。舍弃没有通过测试的片元,并根据结果修改模板缓冲区。模板测试通常用于限制渲染的区域,和一些更高级的用法如渲染阴影、轮廓渲染等。

深度测试(Depth Test):GPU把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较。通常如果当前片元的深度值大于等于当前深度缓冲区的值,就会舍弃它。如果通过测试,开发者还可以指定是否要用这个片元的深度值覆盖掉原来的深度值,这是通过开启/关闭深度写入来做到的。透明效果和深度测试以及深度写入的关系非常密切。

合并功能:每个像素的颜色信息被存储在颜色缓冲区,合并功能决定这次渲染的颜色是覆盖上次的结果还是进行其他处理。对于不透明物体,开发者可以关闭混合(Blend)操作;对于半透明物体,需要使用混合操作。

Shader学习笔记——GPU流水线_第4张图片

双重缓冲(Double Buffering):为了避免我们看到那些正在进行光栅化的图元。对场景的渲染发生在后置缓冲(Back Buffer)中,一旦场景被渲染到了后置缓冲中,GPU就会交换后置缓冲区和前置缓冲区(Front Buffer)的内容,而前置缓冲区是之前显示在屏幕上的图像。由此保证我们看到的图像是连续的。

 

你可能感兴趣的:(Shader)