gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:57:57 26 4
gpt4 key购买 nike

我尝试将片段着色器程序添加到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com