unsigned int mode = osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF;
for( unsigned int ii=0; ii < 4; ii++ )
{
_stateset->setTextureMode( ii, GL_TEXTURE_1D, mode );
_stateset->setTextureMode( ii, GL_TEXTURE_2D, mode );
_stateset->setTextureMode( ii, GL_TEXTURE_3D, mode );
_stateset->setTextureMode( ii, GL_TEXTURE_RECTANGLE, mode );
_stateset->setTextureMode( ii, GL_TEXTURE_CUBE_MAP, mode);
}
4 回答
在设置Texture2D属性时,您确定设置了osg :: StateAttribute :: OVERRIDE位吗?就像这样的东西
其中
ss
是场景图中足够高的节点上的状态集,以包含可能具有纹理的所有内容 .当然,如果GL_TEXTURE_2D模式或任何较低的Texture2D属性都设置了osg :: StateAttribute :: PROTECTED位,那么OVERRIDE将被忽略,但您可能处于一个您知道不会发生的位置 .
您遇到问题的原因可能是某些节点使用osg :: StateAttribute :: OVERRIDE,就像Troubadour(正确地)建议的那样 . 假设是这种情况,您可以创建一个实际遍历整个树并关闭纹理渲染的节点访问者 - 非常粗糙,但会起作用 .
至于问题的第二部分:一个选项是使用OSG中已经内置的函数来交叉 - 将一条光线从眼睛投射到屏幕上的每个像素,并查看它相交的位置 - 非常慢,但是可以用于确定:)那里's also the openGL select mode (though I have to say I'从未使用过它,所以我不知道使用它有多复杂) - 你可以在这里阅读:http://www.opengl.org/resources/faq/technical/selection.htm
您是否考虑过将您的问题发布到OSG邮件列表?这似乎是一个更合适的地方 .
您使用的是osgViewer :: Viewer(单一/默认查看器)还是osgViewer :: View?如果使用addEventHandler()添加了osgGA :: StateSetManipulator,则't'键切换纹理中的纹理 .
最终,被称为 void StateSetManipulator::setTextureEnabled(bool newtexture) . 它的作用是:
其中* _stateset *是高位节点(例如,根节点设置为 Viewer/View->setSceneData() )