在OpenGL中,一切事物都在3D空间中,但我们的屏幕坐标确实2D像素数组,OpenGL大部分工作就是把3D坐标转换成适应屏幕的2D像素。
3D坐标转换成2D屏幕坐标的过程是由OpenGL的图形渲染管线管理的。
图形渲染管线的工作可以被划分为两个主要的部分:
把3D坐标转换成2D坐标。
把2D坐标转换成实际有颜色的像素。
注意:2D坐标和像素是不同的,2D坐标精确的描述了一个点在2D空间中的位置,二2D像素是这个点的近似值,2D像素收到你的屏幕/窗口分辨率的限制
图形渲染管线包含很多部分。首先,我们以数组形式传递3D个3D坐标作为图形渲染管线的输入,用来表示三角形,这个数组叫做定点数据(Vertex Data);定点数据是一系列定点的集合。一个顶点(Vertex)是一个3D坐标的集合。为了简单起见,我们假定每个顶点只由一个3D位置和一些颜色值构成。
注意:OpenGL不知道我们传入的顶点位置和颜色值到底需要构成什么,这个时候就需要我们去指定这些数据去表示渲染类型。做出的这些提示叫做图元(Primitive),我们可以指定一下三种:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。
图形渲染管线的第一个部分是顶点着色器,它把单独的顶点作为输入,顶点着色器的主要目的是吧3D坐标转换成另外一种3D坐标。同时顶点着色器允许我们队顶点属性进行一些基本处理。
图元装配阶段是将顶点着色器输出的顶点作为一个输入,(如果是GL_POINTS,那么就是一个顶点),并把所有的点装配成指定图元的形状。
图元装配阶段的输出会传递给几何着色器。集合着色器吧图元形式的一系列定点作为集合的输入,它可以通过产生新的顶点构造出新的(或者其他的)图元来生成其他的形状。
几何着色器的输出会被传入光栅化阶段,它会把图元转换成最终屏幕上相应的像素生成供片段作色器使用的片段。在片段着色器运行之前会执行裁剪,裁剪会丢弃在视线范围外的所有像素,以提供执行效率。
片段着色器的主要目的是计算一个像素的最终颜色。在颜色确定以后,最终会被传入到一个最后的阶段 ,Alpha测试和混合测试阶段。