我要发帖 回复

管理员

735

主题

2万

积分

30

专家分

忠于职守杰出贡献鼓励

兴趣点(最多三项):

建模技术

私信
发表时间 : 2007-11-23 13:03:58 | 浏览 : 2384    评论 : 1
译者:竹林小舍


原文出处:http://www.nps.navy.mil/cs/sullivan/osgtutorials/osgStateSet.htm

StateSet如何工作?

场景图管理器遍历scene graph,决定哪些几何体需要送到图形管道渲染。在遍历的过程中,场景图管理器也搜集几何体如何被渲染的信息。这些信息存在osg::StateSet实例中。StateSet包含OpenGL的属性/数值对列表。这些StateSet可以和scenegraph中的节点关联起来。在预渲染的遍历中,StateSet从根节点到叶子节点是积累的。一个节点的没有变化的状态属性也是简单的遗传自父节点。






几个附加的特性允许更多的控制和弹性。一个状态的属性值可以被设为OVERRIDE。这意味着这个节点的所有孩子节点——不管其属性值是什么——会遗传其父节点的属性值。OVERRIDE意味着可以被覆盖。如果一个孩子节点把那个属性设为PROTECTED,那么它就可以设置自己的属性值,而不用理会父节点的设置。





一个例子

下面的场景示范了state如何影响scene graph。根节点有一个BLEND模式纹理的基本状态。这个基本状态会被所有子节点继承,除非这个状态的参数改变。根节点的右子树就是这样的。右孩子没有被指定任何状态,所以它使用和根节点一样的状态来渲染。对于节点6,纹理的混合模式没有改变但是使用了一个新纹理。






根节点的左子树的纹理模式被设为DECAL。其他的参数是一样的,所以它们从根节点继承。在节点3中,FOG被打开了并设置为OVERRIDE。这个节点——节点3——的左孩子将FOG设为了OFF。既然它没有设置PROTECTED并且它父节点设置了OVERRIDE,所以就像父节点一样FOG仍然是ON。右孩子4设置FOG属性值为PROTECTED,因此可以覆盖其父节点的设置。
a.jpg
那很不错,但是代码怎么样呢?



下面是操作状态配置并用节点将这些状态关联起来的代码。






// Set an osg::TexEnv instance's mode to BLEND,






// make this TexEnv current for texture unit 0 and assign






// a valid texture to texture unit 0






blendTexEnv->setMode(osg::TexEnv::BLEND);






stateRootBlend->setTextureAttribute(0,blendTexEnv,osg::StateAttribute::ON);






stateRootBlend->setTextureAttributeAndModes(0,ocotilloTexture,osg::StateAttribute::ON);












// For state five, change the texture associated with texture unit 0






//all other attributes will remain unchanged as inherited from above.






// (texture mode will still be BLEND)






stateFiveDustTexture->setTextureAttributeAndModes(0,dustTexture,osg::StateAttribute::ON);












// Set the mode of an osg::TexEnv instance to DECAL






//Use this mode for stateOneDecal.






decalTexEnv->setMode(osg::TexEnv::DECAL);






stateOneDecal->setTextureAttribute(0,decalTexEnv,osg::StateAttribute::ON);












// For stateTwo, turn FOG OFF and set to OVERRIDE.






//Descendants in this sub-tree will not be able to change FOG unless






//they set the FOG attribute value to PROTECTED






stateTwoFogON_OVRD->setAttribute(fog, osg::StateAttribute::ON);






stateTwoFogON_OVRD->setMode(GL_FOG,





osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);












// For stateThree, try to turn FOG OFF.
Since the attribute is not PROTECTED, and






// the parents set this attribute value to OVERRIDE, the parent's value will be used.






//
(i.e. FOG will remain ON.)






stateThreeFogOFF->setMode(GL_FOG, osg::StateAttribute::OFF);












// For stateFour, set the mode to PROTECTED, thus overriding the parent setting






stateFourFogOFF_PROT->setMode(GL_FOG,





osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);












// apply the StateSets above to appropriates nodes in the scene graph.






root->setStateSet(stateRootBlend);






mtOne->setStateSet(stateOneDecal);






mtTwo->setStateSet(stateTwoFogON_OVRD);






mtThree->setStateSet(stateThreeFogOFF);






mtSix->setStateSet(stateFiveDustTexture);






mtFour->setStateSet(stateFourFogOFF_PROT);







编码愉快!


[ 本帖最后由 obuil 于 2007-11-23 01:25 PM 编辑 ]

最近VR访客

jungle_shaw 评论于2008-1-23 21:04:07

回复 #1 obuil 的帖子

Thanks!

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-21 09:28 PM

返回顶部