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类型)
3、osg日志
enum NotifySeverity
{
ALWAYS=0,
FATAL=1,
WARN=2,
NOTICE=3,
INFO=4,
DEBUG_INFO=5,
DEBUG_FP=6
};
将日志等级设置为了DEBUG_INFO,凡是比DEBUG_INFO等级小的日志都会输出,而DEBUG_INFO=5不会输出。
环境变量设置 OSG_NOTIFY_LEVEL=DEBUG_INFO,也可以在代码中设置日志级别
osg::setNotifyLevel(osg::NotifySeverity::INFO);
将日志等级设置为了DEBUG_INFO,用于调试渲染状态,可以输出osg的渲染模式、异常状态、着色器编译情况
4、RenderDoc抓帧osg程序
- 首先需要基于GL3编译osg。
- 抓帧后,即可获取渲染流程和渲染上下文
- 抓帧前,可以使用osg::Geometry的setVertexAttribArray指定着色器缓冲输入位置,比如下面的例子:
geom = new osg::Geometry;
geom->setVertexArray(vertexs);
geom->setNormalArray(normals, osg::Array::BIND_PER_VERTEX);
geom->setTexCoordArray(0, texcoords, osg::Array::BIND_PER_VERTEX);
// 这里设置的编号可能与osg平台自动配置的属性缓冲输入的编号冲突
// 导致问题:gl_Vertex gl_Normal gl_MultiTexCoord0可能无法正确绑定输入缓冲
// 所以使用setVertexAttribArray方法时 最好不要在着色器中使用gl_Vertex gl_Normal gl_MultiTexCoord0这些内置变量
geom->setVertexAttribArray(0, geom->getVertexArray(), osg::Array::BIND_PER_VERTEX);
geom->setVertexAttribArray(1, geom->getNormalArray(), osg::Array::BIND_PER_VERTEX);
geom->setVertexAttribArray(2, geom->getTexCoordArray(0), osg::Array::BIND_PER_VERTEX);
// 上述指定缓冲区位置 与 下列glsl代码对应:
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec3 VertexNormal;
layout(location = 2) in vec2 VertexTexcoord;