前些天弄osg時更改不了模型顏色。這一次我把模型的單個object分出來做一個獨立的文件,然後再由osg的osgDB讀入並顯示。此時發現可以更改 模型的顏色。
仔細觀察,發現在新的獨立文件中,object並沒有對默認的StateSet進行更改。由此看來確實是StateSet的值使object的顏色不能顯 示。
原先的osg文件中,StateSet部分的定義爲:
StateSet {
UniqueID StateSet_0
rendering_hint DEFAULT_BIN
renderBinMode INHERIT
Material {
name "SketchUp_Default"
ColorMode OFF
ambientColor 0.117647 0.117647 0.117647 1
diffuseColor 0.784314 0.784314 0.784314 1
specularColor 0 0 0 0.33
emissionColor 0 0 0 1
shininess 25.6
}
問題出在Material中的ColorMode值上。ColorMode的意義爲它指定了質材的顏色跟蹤屬性。它可能的值有:
AMBIENT :環境光顏色
DIFFUSE :漫射光顏色
SPECULAR :鏡面光顏色
EMISSION :發射光顏色
AMBIENT_AND_DIFFUSE :環境與漫射光顏色
OFF :關閉模式
當ColorMode的值是OFF時,材質的顏色跟蹤屬性被禁止,即材質的屬性值不會隨顏色的改變而變化。於是設置object的顏色將看不到任何的效 果。
解決方法:將ColorMode的值改爲DIFFUSE即可
在程序中的代碼:
osg::ref_ptr<osg::Vec4Array> v = new osg::Vec4Array();
v->push_back(osg::Vec4(1,0,0,1));
geom->setColorArray(v.get());
osg::StateSet* ss = geom->getOrCreateStateSet();
osg::Material* mat = new osg::Material();
mat->setColorMode(osg::Material::ColorMode::DIFFUSE);
ss->setAttribute(mat);