osgfpdepth例子

来源:互联网 发布:报警电话 知乎 编辑:程序博客网 时间:2024/06/06 08:30
看看这几个handler的作用:
StatsHandler统计场景信息(s键)
WindowSizeHandler窗体大小操作(f键)
ScreenCaptureHandler场景截图(c键)
AppState类,应用程序的状态,在构造函数中添加了几个文本显示,并通过Projection节点实现HUD,Projection这个节点以后我们分专题再进行仔细的研究,setRenderBinDetails(11, "RenderBin");这个我们之前分析过,在渲染树中根据数字排序进行渲染。
setProjectionMatrixAsPerspective(40.0, 1.0, appState->zNear, zFar);重新设置了视锥体。走进setupGC函数,创建图形上下文,WindowingSystemInterface——ScreenIdentifier——Traits——GraphicsContext——GraphicsWindow
 double fovy, aspectRatio, zNear, zFar;
    viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,
                                                         zNear, zFar);
    double newAspectRatio = double(traits->width) / double(traits->height);
    double aspectRatioChange = newAspectRatio / aspectRatio;
    if (aspectRatioChange != 1.0)
    {
        viewer.getCamera()->getProjectionMatrix()
            *= Matrix::scale(1.0/aspectRatioChange,1.0,1.0);
    }防止三维场景出现变形
gc->realize();
    gc->makeCurrent();初始化信息,是gc为当前绘制窗体。gc->releaseContext();
释放图形上下文        gc->close(true);关闭图形上下文
每个图形上下文都有一个指定的contextID,这个是在初始化的时候自动构建的,对于GraphicsWindowWin32在初始化的时候getState()->setContextID( osg::GraphicsContext::createNewContextID() );设置了这个contextID,这里很有意思,在Graphicscontext中有static ContextIDMap s_contextIDMap;把所有的contextID都保存起来,保证独一无二,并且把这个数目osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts( contextID + 1 );设置给了DisplaySettings。
FBOExtensions帧缓存对象,判断是否支持帧缓存。
又判断了是否支持"GL_ARB_depth_buffer_float"或"GL_NV_depth_buffer_float"
通过getPossibleConfigs这个函数获取了图形上下文支持的颜色深度类型等信息。
createFBO函数创建FBO帧缓冲对象,在这个函数中根据config信息,把相机中的帧缓存信息读入到data中。destroyFBO销毁FBO对象。
设置了重置gc的回调,重新计算视口大小。
makeTexturesAndGeometry创建了一个Switch节点,添加了帧缓冲中的颜色缓冲和两个不同类型的深度缓冲。
makeRttCamera创建一个RTT相机,作为附属相机加入到了视景中。这个RTT相机什么时候使用呢,看看setStateFromConfig这个函数,获取了这个附属相机,通过setAttachmentsFromConfig函数把视景给了colorTexture纹理。又向憧憬中添加了ConfigHandler和DepthHandler用于控制场景的显示。
以上的分析思路有些乱,我们做一个总结,该例子主要是与帧缓存相关的应用,包括颜色缓存、深度缓存,通过OpenGL函数测试支持的值。Camera相机主要的类,它把GraphicContext和Viewer联系在一起,通过自身的变换从不同角度观看场景,附属相机通过视图和投影矩阵可以使场景变形,实现一些特殊效果,相机还可以实现RTT、HUD等等,之所以有这些功能是因为它里面存储了和帧缓存相关的东西,可以通过相机获取帧缓存中的值实现如本例的效果。
原创粉丝点击