首页 文章

在OpenSceneGraph中禁用纹理

提问于
浏览
0

我需要在OSG中完全禁用纹理 . 我尝试了 glDisable(GL_TEXTURE_2D) 并使用了osg :: stateSet,但是一些具有纹理的节点仍然会渲染它们的纹理 . 有没有办法全球关闭纹理?

一点背景:我需要为场景生成一个对象覆盖图,即知道每个可见像素产生的对象 . 我正在渲染每个具有平面颜色的对象并回读颜色缓冲区 - 这就是为什么纹理会破坏我正在尝试做的事情 . 关于如何实现这一目标的任何其他想法?

4 回答

  • 0

    在设置Texture2D属性时,您确定设置了osg :: StateAttribute :: OVERRIDE位吗?就像这样的东西

    osg::Texture2D*const tex2D = new osg::Texture2D;
    ss->setAttributeAndModes( tex2D, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE );
    

    其中 ss 是场景图中足够高的节点上的状态集,以包含可能具有纹理的所有内容 .

    当然,如果GL_TEXTURE_2D模式或任何较低的Texture2D属性都设置了osg :: StateAttribute :: PROTECTED位,那么OVERRIDE将被忽略,但您可能处于一个您知道不会发生的位置 .

  • 1

    您遇到问题的原因可能是某些节点使用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

  • 0

    您是否考虑过将您的问题发布到OSG邮件列表?这似乎是一个更合适的地方 .

  • 1

    您使用的是osgViewer :: Viewer(单一/默认查看器)还是osgViewer :: View?如果使用addEventHandler()添加了osgGA :: StateSetManipulator,则't'键切换纹理中的纹理 .

    最终,被称为 void StateSetManipulator::setTextureEnabled(bool newtexture) . 它的作用是:

    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);
    }
    

    其中* _stateset *是高位节点(例如,根节点设置为 Viewer/View->setSceneData()

相关问题