osgUtil.IndexMeshVisitor 是一个用于优化图形渲染性能的 OpenSceneGraph 工具类。其作用是为计算几何体(如三角形网格体)创建索引数组,以减少多边形数量,提高渲染效率。同时,该类也可以从现有的索引数组中移除重复的顶点,减少渲染时的数据传输和GPU负载。
#include <osgUtil/IndexMeshVisitor>
// create geometry object
osg::Geometry* geometryObject = ... ;
// create IndexMeshVisitor object
osgUtil::IndexMeshVisitor indexMeshVisitor;
// set optional parameters
indexMeshVisitor.setGenerateIndices(true); // generate index array
indexMeshVisitor.setGenerateInterleavedVertices(false); // separate vertex and normal vectors
indexMeshVisitor.setVertexThreshold(0.01f); // minimum distance between vertices to consider as separate
// traverse the geometry object
geometryObject->accept(indexMeshVisitor);
IndexMeshVisitor();
创建一个 IndexMeshVisitor 对象。
void apply(osg::Geometry& geom);
访问指定的几何体并进行索引计算。该函数将遍历三角形面片(或线段、点等),并针对每个独立的几何体进行索引计算。该函数完成后,三角形几何体的索引数组将被替换为优化后的版本。其他类型的几何体也可能被修改。
void setGenerateIndices(bool value);
设置是否生成索引数组。默认为 true。如果为 false,则只执行重复顶点移除等处理,而不生成索引数组。
void setGenerateInterleavedVertices(bool value);
设置是否将顶点和法线分开存储。默认为 false,即顶点和法线一起存储。如果为 true,则顶点和法线将分别存储。
void setVertexThreshold(float value);
设置重复顶点之间的距离阈值。如果两个顶点在三维空间中的距离小于该值,则认为它们是相同的顶点。默认为0.01。
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgUtil/IndexMeshVisitor>
int main()
{
// create a model node
osg::Group* root = new osg::Group;
osg::Node* model = osgDB::readNodeFile("cow.osgt");
root->addChild(model);
// create an IndexMeshVisitor object
osgUtil::IndexMeshVisitor indexMeshVisitor;
indexMeshVisitor.setGenerateIndices(true);
// traverse the model and apply IndexMeshVisitor to all geometries
model->accept(indexMeshVisitor);
// create a viewer and add the model node
osgViewer::Viewer viewer;
viewer.setSceneData(root);
// run the viewer
return viewer.run();
}