您的位置:首页 > 理论基础

计算机图形学---渲染管线

2017-06-15 13:07 225 查看
手工转载,作者原地址:http://www.cppblog.com/Leaf/archive/2013/02/22/198015.aspx
所谓GPU的的渲染管线,其实可以理解为一个过程,通过这个过程告诉GPU通过一堆数据,得出二维图像,而这些数据包括:视点,三维物体,光源,照明模型,纹理等元素。
而这个过程包括:数据填充-->变换&顶点光照-->裁剪、光栅化等-->像素处理-->alpha测试、深度测试、全局混合等-->输出。

数据填充:处理输入的数据。顶点数据(坐标、法线、颜色等)、纹理数据、矩阵数据、一些常量数据(如世界矩阵、观察矩阵、投影矩阵、纹理矩阵等)。
变换&顶点光照:顶点经过世界变换、观察变换、投影变换,纹理坐标处理,通常在定点经过观察变换后,便开始进行一些光照计算,逐定点光照处理。这一阶段也是可编程管线所提供的顶点变换阶段。也就是说,我们可以通过着色器程序来控制这一阶段的结果。在着色器程序中,我们可以任意处理想要的数据,比如进行纹理坐标缩放、旋转、随机偏移等。
裁剪、光栅化:经过坐标变换和光照后,顶点已经被投影为2D坐标+深度信息。一些不可见的顶点会被裁掉,比如那些处于背面的点。同时,剩下的顶点会被差值计算,以形成像素构成的图元。所有的信息都会被插值,比如纹理坐标、法线、颜色等。光栅化的过程不可控制,仅能决定光栅光的方式。
像素处理:像素处理阶段是一个最耗时,但是也是能使你的渲染效果品质更高的地方,像素最终的样子在这一阶段决定,可以进行纹理映射、逐像素光照、像素附加处理等,做纹理混合、模糊、扩散等效果。这也是可编程管线中使用shader控制的另一个控制过程。
alpha测试、深度测试、全局混合等当像素经过像素处理阶段后,并不能都有机会输出到屏幕上,因为他们还要经过深度(也有一些比较优化的渲染管线将深度测试提到像素处理之前)和模板测试、alpha测试,经过这些测试后,还要进行一次alpha混合,这次与目标缓冲区的混合,能够实现半透明的效果。虚拟世界中的五光十色就是因为这个半透明效果而生动。
在3D渲染流程中,我们能够用着色器语言控制的就是“顶点变换和光照”以及“像素处理”阶段。而GPU中用于处理着色器的最基本帮手就是寄存器。
寄存器的特点是均为四维向量(x,y,z,w)或者(r,g,b,a)。种类包括常量寄存器、输入寄存器、输出寄存器、纹理寄存器、临时寄存器。
输入寄存器就是GPU用来接收数据的寄存器,当渲染数据填充到GPU时,其实就是将这些数据填充到这些输入寄存器上。比如,当我们将一个顶点的位置和法线提交后,GPU在处理这个定点时,其相应的寄存器就会拥有这个顶点相应的值。
顶点处理阶段和像素处理阶段用到的输入寄存器是不同的,输入寄存器决定了相应的处理阶段能够做的事情。比如,我们提交了一个三角形的顶点和纹理坐标信息,并且我们提交了一张纹理,用来对这个三角形做纹理映射。但是,我们是不能在顶点处理阶段就对其纹理做处理的。因为我们不能再顶点处理时访问纹理数据。
常量寄存器:常量寄存器用来向着色器传递我们需要控制的常量信息,比如,世界矩阵、观察矩阵、投影矩阵、纹理矩阵等,以及我们可以设置一些值,比如当前时间,用来实时偏移一个顶点的纹理坐标,使其纹理能呈现移动的效果。又或者通过这个值,动态的改变定点的位置,使其出现波动的效果。这些都是常量寄存器可以干的事情。
同样的,常量顶点处理阶段和像素处理阶段使用的常量寄存器也是不同的,不过,这种情况在SM 4.0以后得到改善(随着DirectX 10时代的到来,Shader Model也升级到了4.0版本。SM4.0中的指令长度被提升到大于64K(即64×1024)的水平,这是SM 3.0规格(渲染指令长度允许大于512)的128倍。)
,并且有一个趋势,就是顶点处理和像素处理阶段的界限不再那么明显。他们可以共用寄存器,公用一些缓存。
临时寄存器:临时寄存器顾名思义就是在处着色器处理过程中存放一些临时的值,若你是用高级着色器语言编写着色器程序,那么你是感觉不到临时寄存器的存在的,因为你仅仅声明了一个临时变量。但确实,这就是临时寄存器的功劳。

纹理采样寄存器:纹理采样寄存器用于存放你所提交的纹理,并且提供纹理采样功能,如临近点采样、双线性采样、三线性采样等。怎么采样根据你的指令来执行,为了辅助你完成纹理映射的工作。
输出寄存器:输出寄存器就是你的着色程序能够输出的内容,输出内容通过输出寄存器传递出来,顶点处理程序的输出有两种:一种是输出到帧缓冲,另一种是输出给像素处理程序。最典型的就是纹理坐标数据,当顶点处理程序拿到输入寄存器传递过来的纹理坐标值后,经过一些处理后又输出。而真正需要使用这个信息的,救赎像素处理程序。常见的有位置、纹理坐标、颜色等。

着色器语言:因为传统的着色器语言,顶点着色程序和像素着色程序不能增加删除顶点,而后加入的几何着色程序可以。
着色器语言有高级和低级语言两种,低级语言采用的是汇编助记符方式。而高级语言是C语言风格,很符合人们的编程习惯。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: