OSG报错或者出现警告怎么办,最快解决方法是查资料问人,但是都不凑效的情况下,只能分析源码了。
报错信息如下:
报错调用方定位
触发位置:[State.cpp] bool State::checkGLErrors(StateAttribute::GLMode mode);
*调用堆栈
然后发现是这个变量有问题才触发checkGLErrors
于是下面这句代码处下断点
[文件名State] void setCheckForGLErrors(CheckForGLErrors check) { _checkGLErrors = check; }
调用堆栈变成了这样:
//SceneView.cpp
if (state->getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS)
{
if (state->checkGLErrors("end of SceneView::draw()"))
{
// go into debug mode of OGL error in a fine grained way to help
// track down OpenGL errors.
//SceneView::draw()的调用处
state->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
}
}
/*是state->checkGLErrors("end of SceneView::draw()")这句代码返回真
导致error被触发*/
OpenGL所有的错误标记
/* ErrorCode */
#define GL_NO_ERROR 0
#define GL_INVALID_ENUM 0x0500
#define GL_INVALID_VALUE 0x0501
#define GL_INVALID_OPERATION 0x0502
#define GL_STACK_OVERFLOW 0x0503
#define GL_STACK_UNDERFLOW 0x0504
#define GL_OUT_OF_MEMORY 0x0505
我的报错属于GL_INVALID_ENUM,所以就去百度,googl找解决办法了。
基本知道问题所在了,由于OpenGL3.3(核心版)及以上版本裁剪了很多老GL的东西,所以OSG一直报错误的枚举变量,就是说以前的变量找不到了。启用3.3会迫使你使用OGL3.3以上的东西。此办法不合适需要向下兼容的开发者,适合刚开始开发用。