osg.GraphicsContext是OpenSceneGraph中用于管理图形上下文的组件,它提供了和OpenGL和窗口系统交互的接口,能够在多种操作系统和硬件平台上运行。
创建一个GraphicsContext需要以下步骤:
#include <osg/GraphicsContext>
int main()
{
osg::GraphicsContext::Traits traits;
traits.windowName = "My osg.GraphicsContext Window";
traits.width = 1024;
traits.height = 768;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
if (gc.valid()) {
// do something with the graphics context
}
return 0;
}
GraphicsContext提供了一些方法来设置和获取它的属性。
可以使用setTraits()函数修改GraphicsContextTraits对象的属性来更新GraphicsContext的绘制区域。
osg::GraphicsContext::Traits traits;
traits.x = 100;
traits.y = 50;
traits.width = 1024;
traits.height = 768;
traits.windowDecoration = true;
gc->setTraits(&traits);
可以使用getWindowHandle()函数获取GraphicsContext实例的窗口句柄,用于在不同平台下完全控制窗口。
osg::GraphicsContext::Traits traits;
traits.windowName = "My osg.GraphicsContext Window";
traits.width = 1024;
traits.height = 768;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
if (gc.valid()) {
void* hWnd = gc->getWindowHandle();
#ifdef WIN32
::ShowWindow( (HWND)hWnd, SW_SHOW );
#endif
}
可以使用setSwapCallback()函数设置graphics context的swap buffer的回调函数。
class MySwapBufferCallback : public osg::GraphicsContext::SwapCallback
{
public:
virtual void swapBuffersImplementation(osg::GraphicsContext* gc)
{
// do something before or after buffer swapping
gc->swapBuffers();
}
};
...
osg::ref_ptr<MySwapBufferCallback> swapCallback = new MySwapBufferCallback;
gc->setSwapCallback(swapCallback.get());
可以使用makeCurrent()将GraphicsContext设为当前上下文,使用doneCurrent()将GraphicsContext设为未使用。这一步通常会在多线程中使用。
gc->makeCurrent();
// do some OpenGL rendering...
gc->doneCurrent();
可以将GraphicsContext添加到Viewer中,以方便管理和渲染。
osgViewer::Viewer viewer;
viewer.setUpViewInWindow(100, 50, 1024, 768);
osg::GraphicsContext::Traits traits;
traits.x = 100;
traits.y = 50;
traits.width = 1024;
traits.height = 768;
traits.windowDecoration = true;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
viewer.getCamera()->setGraphicsContext(gc.get());