解决osg中不能更改模型颜色问题
2016-07-26 14:35
465 查看
前些天弄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);
转自:http://blog.csdn.net/augusdi/article/details/8863101
仔细观察,发现在新的独立文件中,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);
转自:http://blog.csdn.net/augusdi/article/details/8863101
相关文章推荐
- iOS开发:ARC下内存回收机制详解,及如何防止内存泄漏
- 开启WIFI
- c# var的含义与用法
- php正则贪婪匹配与非贪婪匹配一些例子
- 遍历所有磁盘根目录及次级目录,查找目标文件夹
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- NSString内存管理
- UE4导出指定Map
- SQL逻辑查询语句执行顺序
- AsyncTask使用及源码分析
- 动画----帧动画
- dubbo源码分析(一.protocol)
- [转载] ffmpeg函数介绍
- saltstack 实战(二)
- View滑动---学习笔记
- Java的内存机制
- 抽象(abstract)类
- mysql分表分区方案实测:MyISAM引擎分表 or mysql表分区
- 注册表详解
- web前端基础第10天jsdfs