- 前言
设置相机的前景和背景都是使用子相机渲染顺序生成的,通过setRenderOrder设置渲染顺序,POST_RENDER最后渲染,即前景,PRE_RENDER最前渲染,即显示背景。
直接上代码: - 背景
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);//清除深度缓存
- 前景
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);
}
这就可以理解了,我们之所以需要在做背景时需要再设置一下主相机清除颜色渲染,这是因为背景我们先渲染了子相机,然后在渲染主相机时不能使其被子相机的渲染图覆盖,所以需要清除其深度缓存,把深度都设置为最大,相当于主相机的每一个像素点都比子相机的高,并且不能清除颜色缓存,这样就可以把主相机的东西渲染在子相机上。