osg技巧

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;
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值