如何禁用 Openscenegraph 几何节点中的状态属性?

How to disable State attribute in Openscenegraph geometry node?

我尝试将片段着色器程序添加到 OSG::Geometry 节点,如下所示。

    osg::ref_ptr<osg::Geometry> node = new osg::Geometry();
    osg::ref_ptr<osg::Program> m_program= new osg::Program;
    osg::ref_ptr<osg::Shader> fragShader = new osg::Shader(osg::Shader::FRAGMENT);
    //TODO Add LOG if shader failed to load
    if (!fragShader->loadShaderSourceFromFile("Shaders/Sel.frag"))
        return;
    m_program->addShader(fragShader);
    osg::StateSet* state = node->getOrCreateStateSet();
    state->setAttributeAndModes(m_program, osg::StateAttribute::ON);

在某些时候,我使用以下方法删除了该程序

state->removeAttribute(m_program);

删除属性后,下一个立即渲染帧循环 frame() 抛出如下异常。

我尝试调试 openscenegraph 并找到导致问题的地图。

头文件:状态

方法名称:

inline void State::applyAttributeList(AttributeMap& attributeMap,const StateSet::AttributeList& attributeList)

导致异常的变量。

attributeMap

如果我没有删除程序状态属性,它工作正常。仅删除属性,导致问题。

这很可能是因为您正在更新状态集,而渲染线程仍在使用它来完成前一帧的分派。 为确保这是崩溃的原因,您可以尝试使用 OSG SingleThreaded 方案 运行 应用程序(通过查看器上的代码设置它或设置 OSG_THREADING env var) .
如果这是原因并且您想使用其他线程方案之一,您可以将状态集的数据方差设置为 DYNAMIC - 这将确保渲染线程在下一次更新回调之前完成您的状态集要求新框架。
这个主题在 osg-users 邮件列表中已经讨论过很多次,您可以查看存档以获取更多信息。