OSG新建图形并且添加上材质纹理和透明度

直接上代码:

osg::ref_ptr<osg::Geode> createBox() {
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;

    osg::ref_ptr<osg::TessellationHints> hits = new osg::TessellationHints;
    hits->setDetailRatio(0.5);

    osg::ref_ptr<osg::Box> box = new osg::Box(osg::Vec3(0.0, 0.0, 0.0), 1.0, 1.0, 1.0);
    osg::ref_ptr<osg::ShapeDrawable> shape = new osg::ShapeDrawable(box, hits);

    //设置精度
    shape->setTessellationHints(hits.get());

    //设置颜色
    shape->setColor(osg::Vec4(1.0, 1.0, 0.5, 0.5));

    //设置材质
    osg::ref_ptr<osg::Material> material = new osg::Material();
    material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置光照
    material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置融合
    material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 1.0, 0.5));//设置镜面反射
    material->setShininess(osg::Material::FRONT_AND_BACK, 20.0);
    geode->getOrCreateStateSet()->setAttributeAndModes(material.get(), osg::StateAttribute::ON);
    geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);//设置透明度

    //设置纹理
    osg::ref_ptr<osg::Image> image = new osg::Image;
    osg::ref_ptr<osg::Texture2D> texture2D = new osg::Texture2D;

    image = osgDB::readImageFile("Images/skymap.jpg");
    if (image.valid()){
        texture2D->setImage(image);
    }
    geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2D.get(), osg::StateAttribute::ON);

    //geode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);//打开深度测试

    geode->addDrawable(shape.get());


    return geode;
}

int main(int argc, char** argv) {
    for (int i = 0; i < argc; i++) {
        printf(argv[i]);
        printf("\n");
    }

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();


    viewer->addEventHandler(new osgViewer::WindowSizeHandler);
    viewer->addEventHandler(new osgViewer::StatsHandler);

    osg::ref_ptr<osg::Group> root = new osg::Group;
    root->addChild(osgDB::readNodeFile("xyz.osgt")); 
    root->addChild(createBox());

    viewer->setSceneData(root);

    viewer->realize();
    viewer->run();

    return 0;
}

运行结果:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wb175208/article/details/80512191