OSG 的BLEND效果到底怎么样,OPENGL已有人做了实际对比,在这里我也做一个小小的对比。如上图所示,同一个数据模型,做不同的BLEND模式,叠加在不同VIEWER中进行对比显示。
实现如下:
1 首先对文字进行矩阵运算:
osg::ref_ptr<osgText::Text> pText = new osgText::Text;
pText->setPosition(osg::Vec3(10, 0, 10));
pText->setText(_equations_name[i]);
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
mt->setMatrix(osg::Matrix::translate(00, 300, .00)*osg::Matrix::scale(.10, .10, .10)*osg::Matrix::rotate(osg::inDegrees(90.0f),1,0,0));
mt->addChild(pText);
root->addChild(mt);
2 进行多窗口的展示:
for (int j = 0; j < 2; j++)
for (int i = 0; i < 2; i++)
{
osgViewer::Viewer* pViewer = new osgViewer::Viewer;
initViewer(pViewer,j*3+i);
initPos(pViewer, 220+ xoff*i, 20+ yoff*j);
viewers.addView(pViewer);
}
3 每个窗口设置独立的gc和双缓冲:
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = x;
traits->y = y;
traits->width = 600;
traits->height = 500;
traits->doubleBuffer = true;
traits->sharedContext = 0;
traits->windowDecoration = true;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
viewer->getCamera()->setGraphicsContext(gc);
viewer->getCamera()->setViewport(0, 0, traits->width, traits->height);
viewer->getCamera()->setDrawBuffer(buffer);
viewer->getCamera()->setReadBuffer(buffer);
4 设置BLEND模式:
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
stateset->setDataVariance(osg::Object::DYNAMIC);
osg::BlendEquation* blendEquation = new osg::BlendEquation(_equations[i]);
blendEquation->setDataVariance(osg::Object::DYNAMIC);
stateset->setAttributeAndModes(blendEquation,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
//tell to sort the mesh before displaying it
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
loadedModel->setStateSet(stateset);