渲染管线

来源:互联网 发布:属下知罪by枯目 贴吧 编辑:程序博客网 时间:2024/05/08 14:56

pdf文档

基础

GPU处理流程

GPU处理流程

以下是渲染管线流程中的主要几个步骤:

(顶点坐标变换)一旦顶点坐标被转换到eye space 中,就需要判断哪些点是视点可见的。位于viewing frustum 梯形体以内的顶点,被认定为可见,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。这一步通常称之为“clip(裁剪)”,识别指定区域内或区域外的图形部分的过程称之为裁剪算法。

 

Primitive Assembly,图元装配,即将顶点根据primitive(原始的连接关系),还原出网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理,在这个阶段是根据索引将顶点链接在一起,组成线、面单元。之后就是对超出屏幕外的三角形进行裁剪,想象一下:一个三角形其中一个顶点在画面外,另外两个顶点在画面内,这是我们在屏幕上看到的就是一个四边形。然后将该四边形切成两个小的三角形。

 

光栅化:决定哪些像素被集合图元覆盖的过程(Rasterization isthe process of determining the set of pixels covered by a geometric primitive)。经过上面诸多坐标转换之后,现在我们得到了每个点的屏幕坐标值(Screen coordinate),也知道我们需要绘制的图元(点、线、面)。但此时还存在两个问题,问题一:点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确定屏幕坐标值所对应的像素?问题二:在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的2 个像素点绘制一条线段,如果根据已经确定了位置的3 个像素点绘制一个三角形面片?

 

Pixel operation 又称为Raster Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测试的过程而消除,这其中包含了很多种计算颜色的方法以及技术。

 

GPU处理流程中的几个主要裁减算法:

裁减算法主要包括:视域剔除(View FrustumCulling)、背面剔除(Back-Face Culling)、遮挡剔除(Occlusing Culling)和视口裁减等。

视域剔除

在投影变换后进行

背面剔除

图元装配

遮挡剔除

光栅化中的Depth Test

视口裁减

暂不清楚

裁减操作

 

标准的Raster Operations(光栅操作):

 

标准OpenGL和Direct3D 中的Raster Operations(光栅操作)

标准OpenGL和Direct3D 中的Raster Operations(光栅操作)

 


梳理管线中的主要流程

顶点变换(Vertex Transformation):

顶点变换是图形硬件渲染管线种的第一个处理阶段。顶点变换在每个顶点上执行一系列的数学操作。这些操作包括把顶点位置变换到屏幕位置以便光栅器使用,为贴图产生纹理坐标,以及照亮顶点以决定它的颜色。

 

主要的坐标系统和变换:

用于顶点处理的坐标系统和变换

用于顶点处理的坐标系统和变换

 

二.图元装配(Primitive Assembly)和光栅化(Rasterization)

  经过变换的顶点流按照顺序被送到下一个被称为图元装配和光栅化的 阶段。首先,在图元装配阶段根据伴随顶点序列的几何图元分类信息把顶点装配成几何图元。这将产生一序列的三角形、线段和点。这些图元需要经过裁剪到可视平截体(三维空间中一个可见的区域)和任何有效地应用程序指定的裁剪平面。光栅器还可以根据多边形的朝前或朝后来丢弃一些多边形。这个过程被称为挑选 (culling)。 

  经过裁剪和挑选剩下的多边形必须被光栅化。光栅化是一个决定哪些 像素被几何图元覆盖的过程。多边形、线段和点根据为每种图元指定的规则分别被光栅化。光栅化的结果是像素位置的集合和片段的集合。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。例如,一个由三个顶点组成的三角形占据整个屏幕,因此需要生成上百万的片段。

  片段和像素之间的区别变得非常重要。术语像素(Pixel)是图像元素的简称。一个像素代表帧缓存中某个指定位置的内容,例如颜色,深度和其它与这个位置相关联的值。一个片段(Fragment)是更新一个特定像素潜在需要的一个状态。之所以术语片段是因为光栅化会把每个几何图元(例如三角形)所覆盖的像素分解成像素大小的片段。一个片段有一个与之相关联的像素位置、深度值和经过插值的参数,例如颜色,第二(反射)颜色和一个或多个纹理坐标集。这些 各种各样的经过插值的参数是来自变换过的顶点,这些顶点组成了某个用来生成片段的几何图元。你可以把片段看成是潜在的像素。如果一个片段通过了各种各的光光栅化测试,这个片段将被用于更新帧缓存中的像素。

 

三.插值、贴图和着色

  当 一个图元被光栅化为一堆零个或多个片段的时候,插值、贴图和着色阶段就在片段属性需要的时候插值,执行一系列的贴图和数学操作,然后为每个片段确定一个最终的颜色。除了确定片段的最终颜色,这个阶段还确定一个新的深度,或者甚至丢弃这个片段以避免更新帧缓存对应的像素。允许这个阶段可能丢弃片段,这个阶段 为它接收到的每个输入片段产生一个或不产生着过色的片段。

 

四.光栅操作(RasterOperations)

  光栅操作阶段在最后更新帧缓存之前,执行最后一系列的针对每个片段的操作。这些操作是OpenGL和Direct3D的一个标准组成部分。在这个阶段,隐藏面通过一个被称为深度测试的过程而消除。其它一些效果,例如混合和基于模板的阴影也发生在这个阶段。

  光栅操作阶段根据许多测试来检查每个片段,这些测试包括剪切、 alpha、模板和深度等测试。这些测试涉及了片段最后的颜色或深度,像素的位置和一些像素值(像素的深度值和模板值)。如果任何一项测试失败了,片段就会在这个阶段被丢弃,而更新像素的颜色值(虽然一个模板写入的操作也许会发生)。通过了深度测试就可以用片段的深度值代替像素深度值了。在这些测试之后, 一个混合操作将把片段的最后颜色和对应像素的颜色结合在一起。最后,一个帧缓存写操作用混合的颜色代替像素的颜色。

 

形象化图形流水管线:

形象化图形流水管线

形象化图形流水管线

 

 


可编程图形流水线

 

可编程着色器结构:

可编程图形渲染管线

可编程图形渲染管线

 

 

着色器局部示意图:

 

图形硬件渲染管线

图形硬件渲染管线

 

 顶点着色器和像素着色器的数据处理流程:

顶点着色器和像素着色器的数据处理流程

顶点着色器和像素着色器的数据处理流程

 

图中展示了在顶点着色器和像素着色器的数据处理流程。在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer 中;纹理信息传递到texture buffer 中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。

顶点着色器:

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

像素(片段)着色器:

       片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU 而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。


注:

       文中的主要内容来源于网络,欢迎参考!


原创粉丝点击