osg第30讲(前景与背景)

  1. 前言
    设置相机的前景和背景都是使用子相机渲染顺序生成的,通过setRenderOrder设置渲染顺序,POST_RENDER最后渲染,即前景,PRE_RENDER最前渲染,即显示背景。
    直接上代码:
  2. 背景
	osg::ref_ptr<osg::Camera>camera = new osg::Camera;
	camera->setViewMatrix(osg::Matrix::identity());//相机设置为单位矩阵
	camera->setRenderOrder(osg::Camera::PRE_RENDER);
	camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);//清除深度缓存
  1. 前景
	osg::ref_ptr<osg::Camera>camera = new osg::Camera;
	camera->setViewMatrix(osg::Matrix::identity());//相机设置为单位矩阵
	camera->setRenderOrder(osg::Camera::POST_RENDER);
	camera->setClearMask(GL_DEPTH_BUFFER_BIT);//清除深度缓存
	view->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT);

当时写的时候比较头痛的无非是这个清除缓存的设置,后面才发现原来清除深度缓存是把像素的深度全设为一,相机创建的时候会默认清除深度缓存和颜色缓存。

Camera::Camera():
    _view(0),
    _allowEventFocus(true),
    _clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),
    _clearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
    _clearAccum(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
    _clearDepth(1.0),
    _clearStencil(0),
    _transformOrder(PRE_MULTIPLY),
    _projectionResizePolicy(HORIZONTAL),
    _renderOrder(POST_RENDER),
    _renderOrderNum(0),
    _drawBuffer(GL_NONE),
    _readBuffer(GL_NONE),
    _renderTargetImplementation(FRAME_BUFFER),
    _renderTargetFallback(FRAME_BUFFER),
    _implicitBufferAttachmentRenderMask( USE_DISPLAY_SETTINGS_MASK ),
    _implicitBufferAttachmentResolveMask( USE_DISPLAY_SETTINGS_MASK ),
    _attachmentMapModifiedCount(0)
{
    setStateSet(new StateSet);
}

这就可以理解了,我们之所以需要在做背景时需要再设置一下主相机清除颜色渲染,这是因为背景我们先渲染了子相机,然后在渲染主相机时不能使其被子相机的渲染图覆盖,所以需要清除其深度缓存,把深度都设置为最大,相当于主相机的每一个像素点都比子相机的高,并且不能清除颜色缓存,这样就可以把主相机的东西渲染在子相机上。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值