OSG 学习第四天:材质

xiaoxiao2021-02-27  273

OSG 材质 1. osg::Material 材质类 osg::Material 继承自 osg::StateAttribute 类。 材质类示例: //2017.8.4 材质类 #include <osgViewer/Viewer> #include <osg/Node> #include <osg/Geode> #include <osg/Geometry> #include <osg/Group> #include <osg/StateSet> #include <osg/Material> #include <osg/CullFace> #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> #include <iostream> //创建一个四边形节点 osg::ref_ptr<osg::Node> createNode() { osg::ref_ptr<osg::Geode> geode = new osg::Geode(); osg::ref_ptr<osg::Geometry> geom = new osg::Geometry(); //设置顶点 osg::ref_ptr<osg::Vec3Array> vc = new osg::Vec3Array(); vc->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); vc->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)); vc->push_back(osg::Vec3(1.0f, 0.0f, 1.0f)); vc->push_back(osg::Vec3(0.0f, 0.0f, 1.0f)); geom->setVertexArray(vc.get()); //设置纹理坐标 osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array(); vt->push_back(osg::Vec2(0.0f, 0.0f)); vt->push_back(osg::Vec2(1.0f, 0.0f)); vt->push_back(osg::Vec2(1.0f, 1.0f)); vt->push_back(osg::Vec2(0.0f, 1.0f)); geom->setTexCoordArray(0, vt.get()); //设置法线 osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array(); nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); geom->setNormalArray(nc.get()); geom->setNormalBinding(osg::Geometry::BIND_OVERALL); //添加图元 geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); //绘制 geode->addDrawable(geom.get()); return geode.get(); } int main() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); osg::ref_ptr<osg::Group> root = new osg::Group(); osg::ref_ptr<osg::Node> node = createNode(); //得到状态属性 osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet(); //stateset = node->getOrCreateStateSet(); //创建材质对象 osg::ref_ptr<osg::Material> mat = new osg::Material(); //设置正面散射颜色 mat->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); //设置正面镜面颜色 mat->setSpecular(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); //设置正面指数 mat->setShininess(osg::Material::FRONT, 90.0f); stateset->setAttribute(mat.get()); //设置背面剔除 osg::ref_ptr<osg::CullFace> cullface = new osg::CullFace(osg::CullFace::BACK); stateset->setAttribute(cullface.get()); stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); node->setStateSet(stateset.get()); root->addChild(node.get()); //优化场景数据 osgUtil::Optimizer optimizer; optimizer.optimize(root.get()); //设置场景数据 viewer->setSceneData(root.get()); //初始化并创建窗口 viewer->realize(); //开始渲染 viewer->run(); return 0; }
转载请注明原文地址: https://www.6miu.com/read-11509.html

最新回复(0)