|
采用OSG将一个3000*3000的DEM绘制成地形。没有LOD, 我的代码主要分两步,生成顶点数组,生成顶点索引 。下面是代码
1 生成顶点数组
- osg::ref_ptr<osg :: Vec3Array> vecArray=new osg::Vec3Array(this->nrows*this->ncols); //nrows=3000,ncols=30000
- int vi=0;
- for (int i=0;i<nrows;i++)
- {
- for (int j=0;j<ncols;j++)
- {
- //1
- int row=i;
- int col=j;
- float x,y;
- GetXYCoorByColRow(col,row,x,y);
- float z=GetHeightByColRow(col,row);
- if (z==noDataValue)
- {
- z=minHeight;
- }
- osg::Vec3f v1(x,y,z);
-
- (*vecArray)[vi]=v1;
- /* osg::Vec4 cv1;
- this->heightRenderByColor.SetVertexColor(z,cv1);
- (*colorArray)[vi]=cv1;*/
- vi++;
- }
- }
复制代码
2 生成geometry
- osg::ref_ptr<osg::Geometry> geo=new osg::Geometry;
- geo->setVertexArray(v);
- // geo->setColorArray(cv);
- //geo->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
- for(int r=0;r<nrows-1;++r)
- {
- osg:rawElementsUInt& drawElements = *(new osg:rawElementsUInt(GL_QUAD_STRIP,2*ncols));
- geo->addPrimitiveSet(&drawElements);
- int ei=0;
- for(int c=0;c<ncols;++c)
- {
-
- drawElements[ei++] = (r)*ncols+c;
- drawElements[ei++] = (r+1)*ncols+c;
-
-
- }
- }
- geo->setUseDisplayList(false);
- geo->setUseVertexBufferObjects(true);
复制代码
现在的问题是,因为3000*3000的DEM有900万个顶点,我是将这900万个顶点全部放到了vec3array中,怀疑这样会带来很大性能问题, 还有就是,程序是循环DEM的行,然后生成了3000个PrimitiveSet ,这样的方式是否合理,该如何修改能够提高效率,现在的问题是,程序一运行上面的第2步时就卡住了, 谢谢。 |
|