“裁剪”就是从大量的事务中进行挑选、删除。
对一个庞大的三维体而言,往往存在着大量无助于最终渲染结果的对象;将它们从场景中剔除后,将剩余的场景对象发送到OpenGL管线中,即可完成一帧的绘制工作。
这类型的裁剪工作通常称为“可见性裁剪”,即只有真正能够被终端用户看到的对象才会被发送到渲染管线中。
常见de裁剪技术
一、背面裁剪
当我们观察一个不透明物体时,通常大约有一半的物体表面是看不到的,因此完全可以省去这一半的绘制工作,场景的多边形复杂度也将降低1/2左右。
osg本身提供了如下图的背面裁剪的实现函数:
osg::ref_ptr<osg::CullFace>cullface=new osg::CullFace(osg::CullFace::Back);
stace->setAttribute(cullface.get());
state->setMode(GL_CULL_FACE,osg::StateAttribute::ON);
二、视椎体裁剪
视椎体裁剪就是将不在视椎体中的物体剔除掉不绘制,而在视椎体内部或与视椎体相交的物体绘制的方法,此举对性能的提升有着巨大的帮助。
通常,物体是不规则的,为了方便,我们用该物体的包围球与当前视锥体进行比较。
如果包围球在视锥体外,那么不需要绘制此包围球所表达的节点及其所有的子节点。如下图所示,红色方块在视锥体外,该方块将被裁剪。