1 渲染属性和渲染模式
OSG为每个状态属性定义了不同的类,以便应用程序采用。所有的属性类均继承自 osg::StateAttribute。
osg::StateAttribute类是一个无法直接实例化的虚基类。
OSG将所有的属性和模式分为两大部分,即纹理(texture)和非纹理(non—texture)。本节将主要探讨非纹理渲染状态的设置。纹理渲染状态的设置将在后面的章节讨论。OSG之所以为纹理属性的设置提供不同的接口,主要是因为纹理属性需要特别为多重纹理设置纹理单元(texture unit)。
2 设置渲染属性(Attribute)
如果要设置一项属性,首先需要将修改的属性类实例化,设置该类的数值,然后用 osg::StateSet::setAttribute()将其关联到StateSet。
下面的代码段用于实现面剔除(face culling)的属性:
// 获取变量geom 的StateSet指针
osg:StateSer*state-geom~getOrCreateStateSet); // 创建并添加CullFace 属性类
osg:CullFace*cf = new osg:CullFace(osg:CallFace:BACK);
state->setAttribute(cf);
在上面的代码段中,geom是一个Geometry几何类对象(当然也可以是任何其他派生自 Drawable和Node的对象),获取geom的StateSet指针后,代码创建了一个新的osg::CullFace对象,并将其关 联到状态量。
3 设置渲染模式(Mode)
用户可以使用 osg::StateSet::setMode()设置允许或禁止某种模式。
例如,下面的代码将打开雾效模式的许可
//获取一个StateSet 实例
osg StateSet* state = geom->getOrCreateStateSet(); // 允许这个StateSet的雾效模式
state->setMode(GL_FOG,osg:StateAttribute::ON);
setMode()的第一个输入参数可以是任何一个在glEnable()或 glDisable()中合法的 OpenGL 枚举量 Glenum。第二个输入参数可以是osg::StateAttribute::ON或osg::StateAttribute::OFF。
事实上,这里用到 了位屏蔽技术,这个技术将在后面讲解继承状态时说明。
4 设置渲染属性和模式
OSG提供了一个简单的、可以同时设置属性和模式的单一函数接口。在很多情况下,属性和模式之间都存在显著的关系。
例如,CullFace属性的对应模式为GL_CULL_FACE。如果要将某个属性关联到一个StateSet,同时要求打开其对应模式的许可,可以使用osg::StateSet::setAtributeAndModes()方法。
下面的代码段将关联Blend 融合检验的属性,同时许可颜色融合模式。
// 创建一个BlendFunc 属性
osg::BlendFunc* bf = new osg:BlendFunc():
//关联BlendFunc并许可颜色融合模式
state->setAttributeAndModes(bf);
setAttributeAndModes()第二个输入参数用于允许或禁止第一个参数中渲染属性对应的渲染模式,其默认值为ON。这样,用户的应用程序只需用一个函数就可以方便地指定某个渲染属性,并许可其对应的渲染模式。