图形实时渲染是典型的CPU+GPU异构并行任务。传统三维图形管线的渲染由CPU负责输入和定义渲染规则,GPU固定渲染管线负责图形绘制。这种固定的处理模式虽然简化了开发流程,但难以实现复杂效果的三维模拟,束缚了三维图形的表达效果。GPU可编程特性改变了固定图形流水线的模式,实现了面向顶点与像素的编程,使得图形渲染更加灵活和高效。OpenGL 2.0增加了可编程渲染管线,用OpenGL着色语言控制顶点和片段的处理,通过这种更为灵活的图形硬件控制,满足三维图形特效开发的需要。以下为GPU可编程渲染的流程图
纹理映射符号法
(一)逐矢量要素的纹理映射的方法
对场景中的节点(Node)或几何体(Geometry)应用纹理属性时,通常需要预先指定每个顶点的纹理坐标,以便将图像正确地贴至物体上。只有几何体可以设置纹理坐标,因此在设置节点的纹理坐标之前,必须得到该节点子树中所有的几何体对象并设置它们的纹理坐标。为几何体对象geom的纹理单元0设置纹理坐标的具体代码如下:
osg::ref_ptr<osg::Vec2Array> texcoords = newosg::Vec2Array;
texcoords->push_back(…);
…
Geom->setTexCoordArray(0,texcoords.get());
其中,texcoords为纹理坐标,Geom为几何体对象,setTexCoordArray()用于设置几何体对象的纹理坐标数组。
上述方式虽然能实现矢量要素的符号化,但由于此方法每次只能将单个矢量要素进行纹理映射,当加载海量矢量要素时,绘制效率受到影响。
(二)着色器阶段实现矢量要素纹理映射的方法
分析上述方法存在的不足,在此基础上,本文提出了在着色器阶段基于纹理映射实现矢量要素符号化的方法。此方法的主要思想在于利用GPU的高速计算能力和可编程的功能,将纹理映射在着色器阶段实现。采用并行计算能力达到本文预期实现的矢量要素高效符号化的结果。
(1) 顶点着色器主要实现顶点位置的传入与将一些用于后期编程的主要参数的传入(符号尺寸、旋转角度、符号类型等)。具体如下:
gl_TexCoord[0] = vec4(a_size,a_rotation,a_markerType,1.0); gl_Position = gl_Vertex;
其中,a_size,a_rotation,a_markerType为传入参数(符号尺寸、旋转角度、符号类型等),将其传入纹理坐标数组中;并将所有的顶点坐标数据并行地加入顶点着色器。
(2) 几何着色器主要实现顶点坐标的计算,纹理坐标的设置,并将点要素根据传入参数拓展成一个矩形。
根据传入参数计算拓展成的几何体的具体算法如下:
float r= sqrt(earthHeart.x*earthHeart.x+earthHeart.y*earthHeart.y+earthHeart.z*earthHeart