3D渲染管线有助于基于硬件的3D渲染。“管线”(pipeline)一词指的是将渲染过程分解为一组基础操作。GPU由一系列的单元模块组成,每个模块负责上述基础操作中的一种。这些模块被设置成一个级联,这样每一个模块的输出正好成为下一个模块的输入。
可编程图形管线的一个模块图示阐明了这种新的渲染过程(见图2):
图2.可编程图形管线模块图。
顶点着色器 ----> vertex shader
片段着色器 ----> Fragment shader
顶点着色器
输入:
VertexBuffer,它由一个或多个顶点属性流组成。在最低限度,一个顶点缓冲区必须包含顶点位置。这些顶点位置通常指一个位于每个3D模型本地的坐标系统(每个模型拥有自己的原点). 顶点缓冲区可能还包含其他顶点属性,比如顶点颜色或纹理UV坐标。
变换矩阵.
灯光的参数.
顶点位置、
法向量、
纹理坐标等
可以进行的操作:
顶点着色器是一种程序在场景里的每个顶点将调用一次。如果你用一个正方形渲染一个简单的场景,每个角用一个顶点,这个将调用四次。他的工作是执行一些计算像光照,几何变化,等等。计算出最终的顶点的位置,也传输一些数据到片段着色器。
顶点坐标空间转换、
法向量空间转换、
光照计算等操作
输出:
屏幕空间顶点.
顶点颜色或纹理UV坐标.
片段着色器:
输入:
纹理坐标、
光照信息
纹理信息
可以执行的操作:
是一种程序在场景里的每个像素(顺序)将调用一次。如果你用一个正方形渲染一个相同简单的场景,在正方形覆盖的每个像素它将调用一次,片段着色器也能执行光照计算,等等。他们跟重要的工作是设置像素的最终颜色。
输出:
每个呈现的三角形像素的最终像素颜色。
顶点着色器最明显和自然的用途是对屏幕中的几何形状执行矩阵变换。您会获得本地空间中的所有顶点。并将变换矩阵传递给顶点着色器。顶点着色器将使用矩阵转换VertexBuffer中的所有顶点。
顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。
图 10展示了在顶点着色器和像素着色器的数据处理流程。在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。
片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。