OSG之材质

165 阅读2分钟

1 材质类

材质类(osg::Material)继承自 osg::StateAttribute类。osg::Material 封装了OpenGL的glMaterial() 和glColorMaterialO指令的函数功能,其继承关系图如图所示。

2.png

在场景中设置节点的材质属性,首先要创建一个 osg::Material 对象,然后设置颜色和其他参数,再关联到场景图形的StateSet中,如下面的代码:

osg:StateSer* state=node->getOrCreateStateSet(); 
osg:ref_ptr<osg:Material>mat=new osg:Material; 
state->setAttribute(mat.get));

osg::Material 类包含的主要属性如下:

bool _ambientFrontAndBack;//前面与后面的环境光 
Vec4 _ambientFront;//前面的环境光,r、g、b、w 
Vec4 _ambientBack;//后面的环境光,r、g、b、w 

bool _diffuseFrontAndBack;//前面与后面的漫射光 
Veo4 _diffuseFront; //前面的漫射光,r、g、b、w
Vec4 _diffuseBack; //后面的漫射光,r、g、b、w

bool _specularFrontAndBack;//前面与后面的镜面光 
Vec4 _specularFront; //前面的镜面光,r、g、b、w
Vec4 _specular Back; //后面的镜面光,r、g、b、w

bool_emissionFrontAndBack;//前面与后面的发射光(emission) 
Vec4_emissionFront; //前面的emission,r、g、b、w 
Vec4_emissionBack; //后面的cmission,r、g、b.w bool

_shininessFrontAndBack; //前面与后面的发光(shininess) 
float shininessFront; //前面的shininess 
foat shininessBack; //后面的shininess

注意:shininess是一个在0~128.0之间的值,值越大,亮点越小,越亮。

OSG材质的面如下:

enum Face
{
     FRONT = GL_FRONT,//前 
     BACK = GL_BACK,//后
     FRONT_AND_BACK = GL_FRONT_AND_BACK //前、后 
};

OSG材质的颜色模式如下:

enum ColorMode
{
    AMBIENT = GL_AMBIENT, //环境光颜色 
    DIFFUSE = GL_DIFFUSE, //漫射光颜色 
    SPECULAR = GL_SPECULAR,//镜面光颜色 
    EMISSION = GL_EMISSION, //发射光颜色
    AMBIENT_AND_DIFFUSE = GL_AMBIENT_AND_DIFFUSE,//环境与漫射光颜色 
    OFF //关闭模式 
};

2 注意点

在进行很多OpenGL的操作时,直接设置材质属性可能会过于耗费资源,而OSG提供了一种颜色跟踪材质的高效方法,操作比直接修改材质属性的效率更高,颜色跟踪材质(color material)允许用户程序通过改变当前颜色的方法,自动改变某一特定的材质属性。在许多情形下,这一操作比直接修改材质属性的效率要高,能加强光照场景和无光照场景的联系,并满足应用程序对材质的需要。

允许颜色跟踪材质的特性需要调用 setColorMode()方法。osg::Material 类为之定义了枚举量AMBIENT、DIFFUSE、SPECULAR、EMISSION、AMBIENT_AND_DIFFUSE 以及OFF。默认情况下,颜色跟踪模式被设置为OFF,颜色跟踪材质被禁止。如果用户程序设置颜色跟踪模式为其他的值,那么OSG将为特定的材质属性开启颜色跟踪材质特性,此时主颜色的改变将会改变相应的材质属性。后面章节的代码段将允许颜色跟踪材质,此时几何体正面的环境材质和散射材质颜色将自动跟踪当前颜色的改变而改变。

注意:根据颜色跟踪模式的取值不同,Material 类会自动允许或禁止GL_COLOR_MATERIAL,因此,用户程序不需要调用 setAttributeAndModes()来允许或禁止相关的模式值。