多维数据集OpenScreenGraph的一面上的透明度

时间:2014-11-11 09:47:45

标签: visual-c++ transparency openscenegraph

我在VisualStudio的OSG项目中从3dsMax导入了对象(Cube)。但我无法找到如何只透明这个导入的立方体的一个面。这是我的代码:

#include <osgViewer/Viewer>
#include <iostream>
#include <osg/Group>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osg/Notify>
#include <osg/MatrixTransform>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/StateSet>
#include <osg/StateAttribute>
#include <osg/CullFace>
#include <osg/Point>
#include <osg/Light>
#include <osg/LightSource>
#include <osg/BlendFunc>
#include <osg/Material>
#include <osg/PolygonMode>


int main(int argc, char** argv)
{
    osg::ref_ptr<osg::Group> root = new osg::Group;
    osg::ref_ptr<osg::Node> model =  osgDB::readNodeFile("cube.3ds"); //Importing model

    osg::StateSet* state2 = model->getOrCreateStateSet(); //Creating material
    osg::ref_ptr<osg::Material> mat2 = new osg::Material;

    mat2->setAlpha(osg::Material::FRONT_AND_BACK, 0.1); //Making alpha channel
    state2->setAttributeAndModes( mat2.get() ,
        osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);

    osg::BlendFunc* bf = new                        //Blending
        osg::BlendFunc(osg::BlendFunc::SRC_ALPHA,
        osg::BlendFunc::ONE_MINUS_DST_COLOR );
    state2->setAttributeAndModes(bf);      

    root->addChild(model.get());        

    osgViewer::Viewer viewer;
    viewer.setSceneData(root.get());
    viewer.setUpViewOnSingleScreen(0);
    return viewer.run();
}   

这是我刚刚导入文件的来源。我尝试过多次传递实现透明度,但没有成功。 有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:2)

问题中的代码确实使模型透明化。例如,使用OSG数据包中的cessna模型:

A transparent cessna

再添加两个模型,一个框和一个球体,其中框也有混合:

With a box and a sphere

From another angle

我们看到混合正在发挥作用。如果添加另一个模型但未显示,则可能是在其他模型之前渲染平面。如果飞机碰巧在其他模型的前面,即使飞机是透明的,你也看不到它们;因为他们没有通过深度测试。

添加

cessna->getStateSet()->setMode( GL_BLEND, osg::StateAttribute::ON );
cessna->getStateSet()->setRenderingHint( osg::StateSet::TRANSPARENT_BIN );

强制在不透明模型之后渲染cessna。

另请注意,如果您提供混合功能,则无需致电

cessna->getStateSet()->setMode( GL_BLEND, osg::StateAttribute::ON );

让我们看一下另一个场景,盒子在飞机后面,我们没有设置渲染提示:

The box is behind the plane, but the rendering hint is deactivated

现在渲染提示处于活动状态:

The box is behind the plane and we have set the rendering hint