首页 > 其他 > 详细

GPU流水线

时间:2020-12-09 20:58:53      阅读:39      评论:0      收藏:0      [点我收藏+]

概述

  渲染流水线可以简单分为3个阶段即应用阶段、几何阶段、光栅化阶段。应用阶段是由CPU来完成的,而几何阶段和光栅化阶段是由GPU来完成。对于后两个阶段,GPU通过实现流水线化,大大加快了渲染速度,我们无法完全控制这两个阶段的实现细节,但是GPU向开发者开放了很多控制权。下图展示了流水线的具体流程:

技术分享图片

GPU的渲染流水线接收顶点数据作为输入,这些顶点数据是由CPU控制的应用阶段加载到显存中,再由DrawCall指定。

几何阶段

顶点着色器(Vertex Shader):是完全可编程的,它通常用于实现顶点的空间变换,顶点着色等功能

曲面细分着色器(Tessellation Shader):可选着色器,用于细分图元

几何着色器(Geometry Shader):可选着色器,用于执行逐图元着色操作,或用于产生更多的图元

剪裁(Clipping):可以配置但不可编程,裁剪掉不在摄像机视野的顶点,并剔除某些三角图元的面片。

屏幕映射(Screen Mapping):不可配置和编程,负责把每个图元坐标转换到屏幕坐标系中。

光栅化阶段

三角形设置(Triangle Setup)和三角遍历(Triangle Traversal):固定函数阶段

片元着色器(Fragment Shader):完全可编程,用于实现逐片元的着色操作

逐片元操作(Per-Fragment Operations):不可编程,但具有很高的可配置性 负责执行很多操作,例如修改颜色、深度缓冲、进行混合。

顶点着色器(Vertex Shader)

  顶点着色器本身不可以创建或者销毁任何顶点,而且无法的到顶点与顶点之间的关系。这种相互独立性使得GPU可以并行化处理每一个顶点, 这意味着这一阶段处理速度会很快。

  顶点着色器除了坐标变换和逐顶点光照这两个主要任务外,还可以输出后续阶段所需的数据

  顶点着色器有不同的输出方式,最常见的是经光栅化后交给片元着色器进行处理,在现代 Shader Model 中,它还可以把数据发送给曲面细分着色器和几何着色器

坐标变换

  一个最基本的顶点着色器必须完成的工作是把顶点坐标从模型空间转换到齐次剪裁空间,常见代码为:(o.pos = mul(UNITY_MVP,v.position)),接着再由硬件做透视除法,最终得到归一化设备坐标(Normalized Device Coordinate,NDC)值在[-1,1]之间。我们可以通过改变顶点的位置来模拟水面、布料等。

剪裁(Clipping)

  一个图元如果部分在视野内需要经过剪裁,方法是讲视野外的顶点由视野内的顶点代替。这一步是硬件上的固定操作,我们可以通过自定义剪裁操作来对这一步进行配置。

屏幕映射(Screen Mapping)

  把每个图元的x和y坐标转换到屏幕坐标系,由于我们输入的坐标值在-1到1之间,所以这个过程实际上是一个缩放的过程,注意屏幕映射不会对z坐标做任何处理。屏幕坐标系和z坐标一起构成窗口坐标系,屏幕映射得到的屏幕坐标决定了顶点对应屏幕上的哪个像素以及距离这个像素有多远。

 三角形设置(Triangle Setup)

  计算光栅化一个三角网络所需的信息(一个计算三角网格表示数据的过程)

三角形遍历(Triangle Traversal)

  根据上一个阶段的计算结果来判断一个三角形覆盖了哪些像素,并使用网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。最后输出一个片元(fragment)序列,这个阶段也被称为扫描变换(Scan Conversion)。

  一个片元并不是真正意义上的像素,它包含了很多状态集合(屏幕坐标、深度信息、顶点信息),这些状态用于计算每个像素的最终颜色。 

片元着色器(Fragment Shader)

  又称像素着色器(Pixel Shader),片元着色器的输入是上一个阶段对顶点信息插值得到的结果,这一阶段完成很多重要的渲染技术,其中最重要的技术是纹理采样。

逐片元操作(Per-Fragment Operations)

  又称输出合并阶段(Output-Merger)

  这一阶段有几个主要任务。

  (1)决定每个片元的可见性。这会涉及很多测试工作,比如深度测试、模板测试

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

 

技术分享图片

 

模板测试(Stencil Test)

  如果开启了模板测试,GPU会首先读取(使用读取掩码)模板缓冲区中该片元位置的模板值然后将该值和读取(使用掩码读取)到的参考值(reference value)进行比较,开发者可以指定该比较函数,例如小于时舍弃该片元,或者大于时舍弃该片元。如果该片元没有通过测试,该片元就会被舍弃。不管一个片元有没有通过测试,开发者都可以根据模板测试和深度测试来修改模板缓冲区。另外,模板测试还有一些高级用法,如渲染阴影、轮廓渲染等

深度测试(Depth Test)

  片元通过模板测试后就会进行深度测试,如果开启了深度测试,GPU会把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较。和模板测试一样,开发者可以指定该函数。和模板测试不同的是,如果一个片元没有通过深度测试,它就没有权利修改深度缓冲区的值。如果通过了测试,开发者还可以指定是否要用这个片元的深度值覆盖掉原有的深度值。

混合

  该过程主要针对透明的物体,对于不透明的物体可以关闭混合。是当前得到的颜色信息与颜色缓冲区中的信息的混合。开发者可以选择开启和关闭混合功能,关闭后就会直接使用片元的颜色覆盖掉缓冲区的颜色。

总结

  当模型的图元经过上面的层层计算和测试后,就会显示到屏幕上。我们屏幕显示的就是颜色缓冲区的颜色值,为了保证我们看到的图像是连续的,GPU会使用双重缓冲的策略,对场景的渲染在后置缓冲中(Back Buffer),一旦场景已经被渲染到了后置缓冲中,GPU就会交换后置缓冲和前置缓冲(Front Buffer)中的内容。

 

GPU流水线

原文:https://www.cnblogs.com/FanJiangDaoHai/p/14070241.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!