osgViewer.PixelBufferWin32 是一个开源的基于 OpenSceneGraph 技术的可视化组件,提供了在 Windows 平台下创建像素缓冲区的功能,主要用于离屏渲染。
在程序中包含头文件 osgViewer/PixelBufferWin32
,并使用命名空间 osgViewer
。
#include <osgViewer/PixelBufferWin32>
using namespace osgViewer;
创建 PixelBufferWin32 对象。
osg::ref_ptr<PixelBufferWin32> pbw = new PixelBufferWin32();
使用 setPixelSize()
方法设置像素的尺寸。
pbw->setPixelSize(640, 480);
使用 setClearMask()
方法设置清屏标志位。
pbw->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
使用 setDrawCallback()
或 setDrawCallbackAndContinue()
方法设置回调函数。回调函数的参数是 osg::Camera
,需要在该函数中完成场景图对相机的挂载、渲染等操作。
pbw->setDrawCallback(new MyCameraDrawCallback());
使用 attach()
方法将缓冲区附加到相机上。
pbw->attach(osg::Camera::COLOR_BUFFER0, GL_RGBA);
在绘制前,使用 pbw->prepareForRender()
方法准备渲染环境。
pbw->prepareForRender();
调用场景图的 accept()
方法将相机挂载到场景图中进行渲染。
viewer.setSceneData(scene);
viewer.addSlave(pbw.get(), osg::Matrixd(), osg::Matrixd());
viewer.realize();
在绘制后,使用 getImage()
方法获取渲染结果。
osg::ref_ptr<osg::Image> image = pbw->getImage();
以下是一个完整的示例程序,包括场景图的构建、相机的挂载、渲染和渲染结果的保存。该示例程序使用了 OpenSceneGraph 3.7.0 版本。
#include <osg/Group>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osgViewer/PixelBufferWin32>
class MyCameraDrawCallback : public osg::Camera::DrawCallback
{
public:
virtual void operator()(osg::RenderInfo& renderInfo) const
{
osg::Camera* camera = renderInfo.getCurrentCamera();
osg::Node* node = camera->getSceneData();
if (node) node->accept(renderInfo);
}
};
int main(int argc, char** argv)
{
// 场景图构建
osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0, 0, 0), 1.0);
osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(sphere);
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(drawable);
osg::ref_ptr<osg::Group> scene = new osg::Group();
scene->addChild(geode);
// PixelBufferWin32 配置
osg::ref_ptr<PixelBufferWin32> pbw = new PixelBufferWin32();
pbw->setPixelSize(640, 480);
pbw->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
pbw->setDrawCallback(new MyCameraDrawCallback());
pbw->attach(osg::Camera::COLOR_BUFFER0, GL_RGBA);
// 图形窗口配置
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->setSceneData(scene);
viewer->addSlave(pbw.get(), osg::Matrixd(), osg::Matrixd());
viewer->realize();
// 开始渲染
pbw->prepareForRender();
viewer->frame();
// 保存图片
osg::ref_ptr<osg::Image> image = pbw->getImage();
osgDB::writeImageFile(*image, "screenshot.png");
return 0;
}
PixelBufferWin32
进行离屏渲染时,不需要创建 GL 窗口,因此无需选取主线程(主线程在 Windows 下必须选取 GL 窗口)。