On Windows, create a graphics context with the pbuffer flag set to true
and windowDecoration set to false.
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = 640;
traits->height = 480;
traits->red = 8;
traits->green = 8;
traits->blue = 8;
traits->alpha = 8;
traits->windowDecoration = false;
traits->pbuffer = true;
traits->doubleBuffer = false; // or true as needed
traits->sharedContext = 0;
m_pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
if (!m_pbuffer.valid())
{
osg::notify(osg::NOTICE) << "Pixel buffer has not been created successfully. NOTE: update your dependencies folder if you see this error!" << std::endl;
exit(1);
}
else
{
// Create an osgViewer running on top of a pbuffer graphics context
m_viewer = new osgViewer::Viewer();
// in my case I use a slave camera with ortho projection
// to render whatever is needed
m_camera = new osg::Camera;
m_camera->setGraphicsContext(m_pbuffer.get());
m_camera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
m_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
m_camera->setViewMatrix(osg::Matrix());
m_camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 1.0, 0, 1.0));
m_camera->setViewport(new osg::Viewport(0, 0, 640, 480));
m_camera->setDrawBuffer(GL_FRONT);
m_camera->setReadBuffer(GL_FRONT);
m_viewer->addSlave(m_camera.get(), osg::Matrixd(), osg::Matrixd());
m_viewer->realize();
I do not know if the same would work on Linux, as pbuffers on Linux are an optional extension that might not be supported.
I get this to render at arbitrary frame rates, entirely decoupled from the screen's VBLANK interval.
Christian