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

标签 c++ openscenegraph

我尝试将片段着色器程序添加到 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() 抛出如下异常。

enter image description here

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

头文件:状态

方法名称:

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

导致异常的变量。

attributeMap

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

最佳答案

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

关于c++ - 如何禁用 Openscenegraph 几何节点中的状态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861628/

相关文章:

c++ - 为什么这会进入无限循环?

c++ - fatal error LNK1104 : cannot open . lib (glloaD)

C++使用位移位分配显式枚举值

c++ - 带有 QWidget 的 OSG 显示额外的边框

c++ - OpenSceneGraph 将相机设置在初始位置

c++ - opengl 3+缓冲操作

c++ - 带有函数指针的初始化器列表——这里有技巧吗?

c++ - pthread_join 错误代码 3

c++ - OSG地球相机位置

android - 如何从 Android NDK 获取资源中的文件