渲染中的GPU流水线

渲染中的GPU流水线

此文章收录于我主页顶置的:Unity Shader入门精要文章目录,点击即可跳转。

简述:
(1)CUP通过调用Draw call来命令GPU进行渲染,GUP的渲染过程就是GUP流水线。
(2)对于概念阶段的后面两个阶段:几何阶段和光栅化阶段,开发者没有绝对的控制权,但是GPU还是向开发者开放了很多控制权限,其实现的载体是GPU。

几何阶段和光栅化阶段可以分成若干更小的流水线阶段,这些流水线阶段由GPU来实现,每个阶段GPU提供了不同的可配置性或可编程性。图2.6中展示了不同的流水线阶段以及它们的可配置性或可编程性。
在这里插入图片描述
GUP流水线的渲染过程(结合上图):

几何阶段:
(1)顶点数据:GUP的渲染流水线接收顶点数据作为输入。这些顶点数据是由应用阶段加载到显存中,再由Draw Call制定,随后被传递给顶点着色器。
(2)顶点着色器:顶点着色器是完全可编程的,它通常用于实现顶点的空间变换、顶点着色等功能。
(3)曲面细分着色器:一个可选的着色器,它用于细分图元。
(4)几何色器:一个可选的着色器,它可以被用于执行逐片元的着色操作,或者被用于产生更多的图元。
(5)裁剪: 这一阶段的透视除法后的是将那些不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片。这个阶段是可配置的。例如,我们可以使用自定义的裁剪平面来配置裁剪区域,也可以通过指令控制裁剪三角图元的下面还是背面。
(6)屏幕映射:这一阶段是不可配置和编程的,它负责把每个图元的坐标转换到屏幕坐标系中。

几何阶段的任务:用于处理我们要绘制的几何相关的事情,例如要绘制的图元是什么,怎么绘制;重要任务是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。

光栅化阶段:
(1)三角形设置:固定函数(Fixed-Function) 的阶段。
(2)三角形遍历:固定函数(Fixed-Function) 的阶段。
(3)片元着色器:完全可编程的,它用于实现逐片元(Per-Fragment) 的着色操作。
(4)逐片元操作:负责执行很多重要的操作,例如修改颜色、深度缓冲、进行混合等,它不是可编程的,但具有很高的可配置性

光栅化阶段的任务:这一阶段将会使用上一个阶段传递的参数来生产像素,并渲染出最终的图像;主要任务是决定每个渲染图元中那些像素应该被绘制在屏幕上。

几何阶段重要步骤及其特点:

顶点着色器
特点:
(1)处理单位是顶点,输入进来的每个顶点都会调用一次顶点着色器。
(2)其本身不能够创建或者摧毁一个顶点,而且无法得到顶点与顶点之间的关系。
(3)每个顶点独立并行处理,处理速度很快。

需要完成的工作:
1)坐标变换;2)逐顶点光照;3)输出后续阶段所需要的数据
在这里插入图片描述
坐标变换
对顶点的坐标(即位置)进行某种变换。项点着色器可以在这一步中改变顶点的位置,这在顶点动画中是非常有用的。
例如,我们可以通过改变顶点位置来模拟水面、布料等。但需要注意的是,无论我们在顶点着色器中怎样改变项点的位置,一个最基本的顶点着色器必须完成的一个工作是:把顶点坐标从模型空间转换到齐次裁剪空间

o.POs=mul (UNITY_MVP, V.position);

类似上面这句代码的功能,就是把顶点坐标转换到别齐次裁剪坐标系下, 接着通常再由硬件做透视除法后,最终得到归一化的设备坐标(Nomalied Device Cordinates,NDC).图28展示了这样的一个转换过程。
在这里插入图片描述
需要注意的是:
(1)图2.8给出的坐标范围是OpenGL同时也是Unity使用的NDC,它的Z分量范围在[1,1]之间,而在Direex中,NDC 的z分量范围是[0, 1]

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

裁剪
(1)完全在摄像机视野范围中的图元保留、部分在摄像机视野范围中的图元裁剪、完全不在摄像机视野范围中的图元不会再向下传递。
(2)不可编程,可配置。

屏幕映射
(1)输入的坐标是三维坐标系下的坐标。
(2)任务是把每个图元的X坐标和Y坐标转换成屏幕坐标,由于输入的坐标范围是-1到1,这个过程也就相当于一个缩放的过程
(3)屏幕映射不会对Z坐标做任何处理。
(4)屏幕坐标系和Z坐标一起构成了窗口坐标系。

在这里插入图片描述

屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。

OpenGL和DirectX之间的差异问题:
OpenGL把屏幕左下角当成最小的窗口值,而DirectX则定义了屏幕左上角为最小的窗口坐标值
在这里插入图片描述
光栅化阶段重要步骤及其特点:

两个最重要的任务:1)计算每个图元覆盖了哪些像素;2)为这些像素计算它们的颜色

三角形设置
具体来说,上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。它的输出是为了给下一个阶段做准备。

三角形遍历
三角形遍历阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖的话,就会生成一个片元(fragment)。而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换。
在这里插入图片描述
这一步的输出就是得到一一个片元序列。需要注意的是,一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包括了(但不限于)它的屏幕坐标、深度信息,以及其他从几何阶段输出的顶点信息,例如法线、纹理坐标等。

片元着色器(可编程)(在DirectX中又被称作像素着色器
片元用来存储一系列数据。片元着色器仅可以影响单个片元,当执行片元着色器时,它不能将自己的任何结果发给它的邻居。

片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器中输出的数据插值得到的。而它的输出是一个或者多个颜色值。
在这里插入图片描述
这一阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。 为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标。

逐片元操作

逐片元操作是GPU流水线中的最后一个阶段,也是书中介绍得最多的一个阶段,在这一阶段中的GPU要对每一个片元进行一系列的操作,例如合并一些数据,主要任务:(1)决定每个片元的可见性。这涉及到的工作有很多,如深度测试、模板测试等。(2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经储存在颜色缓存区中的颜色进行合并,或者说是混合。这个阶段具有高度的可配置性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值