osgTerrain.SharedGeometry是OpenSceneGraph中的一个用于地形渲染的类,用于处理多个瓦片之间可能存在的顶点共享和拼接问题。该类可以让不同的瓦片共享重叠的顶点,提高渲染效率。
class osgTerrain::SharedGeometry : public osg::Referenced
{
public:
SharedGeometry();
SharedGeometry(const std::string& name);
SharedGeometry(const SharedGeometry& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
~SharedGeometry();
void setVertexData(osg::Vec3Array* vertices);
osg::Vec3Array* getVertexData() const;
void setNormalData(osg::Vec3Array* normals);
osg::Vec3Array* getNormalData() const;
void setTexCoordData(unsigned int unit, osg::Vec2Array* texCoords);
osg::Vec2Array* getTexCoordData(unsigned int unit) const;
osg::Geometry* createGeometry(const osg::BoundingBox& bbox) const;
unsigned int getNumTiles() const;
void setTile(unsigned int i, unsigned int j, osg::DrawElementsUInt* indices);
void invalidate();
bool getDirty() const;
void setDirty(bool dirty);
bool getUseVertexBufferObjects() const;
void setUseVertexBufferObjects(bool flag);
protected:
std::string _name;
osg::ref_ptr<osg::Vec3Array> _vertices;
osg::ref_ptr<osg::Vec3Array> _normals;
std::vector< osg::ref_ptr<osg::Vec2Array> > _texCoords;
osg::ref_ptr<osg::IndexBufferObject> _indexBufferObject;
std::vector<osg::DrawElementsUInt*> _tiles;
bool _dirty;
bool _useVertexBufferObjects;
};
SharedGeometry();
SharedGeometry(const std::string& name);
SharedGeometry(const SharedGeometry& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
SharedGeometry()
:默认构造函数,创建一个空的SharedGeometry。SharedGeometry(const std::string& name)
:指定名称的构造函数,创建一个名称为name
的SharedGeometry。SharedGeometry(const SharedGeometry& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY)
:复制构造函数,创建一个与rhs
共享顶点和法线的SharedGeometry。setVertexData()
void setVertexData(osg::Vec3Array* vertices);
设置顶点数据。vertices
为一个Vec3Array
类型的数组,表示顶点坐标。
getVertexData()
osg::Vec3Array* getVertexData() const;
获取顶点数据数组。
setNormalData()
void setNormalData(osg::Vec3Array* normals);
设置法线数据。normals
为一个Vec3Array
类型的数组,表示法线向量。
getNormalData()
osg::Vec3Array* getNormalData() const;
获取法线数据数组。
setTexCoordData()
void setTexCoordData(unsigned int unit, osg::Vec2Array* texCoords);
设置纹理坐标数据。unit
为纹理单元,范围为0到7,texCoords
为一个Vec2Array
类型的数组,表示纹理坐标。
getTexCoordData()
osg::Vec2Array* getTexCoordData(unsigned int unit) const;
获取纹理坐标数据数组。
createGeometry()
osg::Geometry* createGeometry(const osg::BoundingBox& bbox) const;
创建渲染用的几何对象。bbox
为当前瓦片的包围盒,该函数会将共享的顶点分配到对应的绘制元素里,并创建一个Geometry
类型的对象用于渲染。
getNumTiles()
unsigned int getNumTiles() const;
获取瓦片数量。
setTile()
void setTile(unsigned int i, unsigned int j, osg::DrawElementsUInt* indices);
设置指定瓦片的索引数据。i
和j
分别为瓦片在水平和垂直方向的编号,indices
为一个DrawElementsUInt
类型的数组,表示该瓦片的绘制索引。
invalidate()
void invalidate();
标记共享缓冲区为无效,该函数会在下一次渲染时重新生成共享数据。
getDirty()
bool getDirty() const;
获取共享缓冲区是否已经被标记为需要更新。
setDirty()
void setDirty(bool dirty);
设置共享缓冲区是否需要更新。
getUseVertexBufferObjects()
bool getUseVertexBufferObjects() const;
获取是否使用顶点缓冲对象(VBO)。
setUseVertexBufferObjects()
void setUseVertexBufferObjects(bool flag);
设置是否使用顶点缓冲对象(VBO)。