1、让模型始终显示在前面
当A模型覆盖住B模型,要让B模型始终显示,可进行如下操作:
方法一、
B->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); // 关闭深度测试,并设置覆盖标志
B->getOrCreateStateSet()->setRenderBinDetails(100.0, “RenderBin”); // 设置渲染系数,哪个模型要显示在前面,就调大该模型的渲染系数
方法二:
// 开启深度测试,并设置覆盖标志,深度测试总是通过
osg::Depth* dep = new osg::Depth;
dep->setFunction(osg::Depth::Function::ALWAYS);
B->getOrCreateStateSet()->setAttribute(dep, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
B->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
// 设置渲染系数,哪个模型要显示在前面,就调大该模型的渲染系数
B->getOrCreateStateSet()->setRenderBinDetails(100.0, “RenderBin”);
osg状态集说明:
osg::StateAttribute::OVERRIDE //所有子节点都将继承这一属性或模式,子节点对其更改无效
osg::StateAttribute::PROTECTED //设置了这一属性的子节点的渲染属性或模式不会受到父节点的影响
osg::StateAttribute::INHERIT //强制子节点继承父节点的渲染状态,自己本身的渲染状态被解除
2、osg强制使用double类型的顶点数据
a. 顶点数据设置 osg::Vec3dArray->setPreserveDataType(true)
b. 顶点着色器设置 in dvec3 VertexPosition
(考虑到顶点数据是double类型,故变换矩阵uniform变量类型也需要double类型,dmat4)
(gl_Position是vec4类型)