运行案例:运行这篇博客的opengl4.3的例子,OSG使用GLSL各个版本例子,报如下错误:
Warning: detected OpenGL error 'invalid operation' at after pcp->apply(Unfiorm&) in GLObjectsVisitor::apply(osg::StateSet& stateset), unifrom name: MVP
Warning: detected OpenGL error 'invalid operation' at after RenderBin::draw(..)
问题原因:经过分析,是因为矩阵MVP在客户端CPU里面是double类型,在服务端GPU里是float类型导致。
修改策略:保持服务端里的float型不变(不修改shader),修改C++的矩阵类型,修改以下两处:
// 更新矩阵virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) {osg::Matrix modelView = mCamera->getViewMatrix();osg::Matrix projectM = mCamera->getProjectionMatrix();uniform->set(osg::Matrixf(modelView * projectM));}
// 矩阵初始化
osg::Uniform* MVPUniform = new osg::Uniform("MVP", osg::Matrixf());
案例运行结果:
附注:使用vcpkg安装的osg(默认编译选项),就可以支持opengl4的shader,不需要在编译时指定开启opengl3的选项,开启了可能反而会有问题。