osg設置物體顏色有兩種方式,第一種是直接設置頂點的顏色,第二種是設置材質的顏色。一般只選其中一種。
先說第一種,可以直接將每個頂點的顏色傳入Geometry中。
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.0));
colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.0));
colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.0));
colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.0));
colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.0));
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
然後在材質中設置顏色的模式。
osg::Material* material = new osg::Material;
material->setColorMode(osg::Material::AMBIENT);
stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
關於顏色模式怎麼設置的問題,本人經過測試,發現顏色模式的意思有可能是:將頂點顏色以哪種方式表示。意思是說,如果設置爲osg::Material::AMBIENT,頂點顏色以環境光的方式表示;如果設置爲osg::Material::DIFFUSE,頂點顏色以漫反射的方式表示。大家可以將當前光源的環境光設置爲最亮,漫反射和鏡面反射都設置爲0。這時物體材質設置爲osg::Material::AMBIENT是有顏色的,而設置爲osg::Material::DIFFUSE是黑色的。如果將當前光源的漫反射設置爲最亮,環境光和鏡面反射都設置爲0。這時物體設置爲osg::Material::DIFFUSE纔是有顏色的。
然後是第二種設置顏色的方式是不設置頂點顏色,只設置材質顏色。
osg::StateSet* stateSet = geode->getOrCreateStateSet();
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
osg::Material* material = new osg::Material;
material->setAmbient(osg::Material::FRONT, osg::Vec4(0xCC / 255.0, 0x99 / 255.0, 0x33 / 255.0, 0.8f));
stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
注意:此時不需要調用材質的setColorMode來設置顏色模式。