设置 CheckForGLErrors 状态

Set CheckForGLErrors State

我对 OSG 发出的多个 "Warning: detected OpenGL error 'invalid value' after RenderBin::draw(...)" 错误消息有疑问。我发现 this thread 展示了一种添加额外调试信息的方法。不幸的是我找不到设置状态的方法。

我可以创建一个状态并使用代码设置标志:

osg::ref_ptr<osg::State> debugState = new osg::State();  
debugState->setCheckForGLErrors(osg::State::CheckForGLErrors::ONCE_PER_ATTRIBUTE);

但是之后我该怎么办?我找不到将 State 添加到 StateSet 的方法。

您显然可以使用 gDEBugger,正如线程中的一些答案所建议的那样。如果您仍然想通过 osg::State 真正做到这一点,那么您可以向所有可绘制对象添加一个 osg::Drawable::DrawCallback。然后在 DrawCallbackdrawImplementation 中你可以做一些像 -

virtual void drawImplementation (osg::RenderInfo & renderinfo, const osg::Drawable * drawable) const 
{
  State& state = *renderInfo.getState();
  state->setCheckForGLErrors(osg::State::CheckForGLErrors::ONCE_PER_ATTRIBUTE);
  drawable->drawImplementation(); 
}

我不太确定这么晚更改状态是否会完美运行,您需要检查一下。如果它不起作用,您还可以在调用 drawable->drawImplementation() 之前和之后执行类似 state.checkGLErrors("start of Geometry::drawImplementation()");state.checkGLErrors("end of Geometry::drawImplementation()"); 的操作。