[osg-users] osgParticle and osgPPU not compatible

alexandre amyot murray alex.amyotmurray at gmail.com
Wed Sep 17 07:29:48 PDT 2008


Hi Art and Robert,

First of all I dont use my own viewer class, I use osgViewer. I initialize
the viewer camera like this to support osgPPU :

    // Set single thread model
    viewer_.setThreadingModel(osgViewer::Viewer::SingleThreaded);

    // Set the main window position and size
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
    traits->x                = windowProperties_.winXPos_;
    traits->y                = windowProperties_.winYPos_;
    traits->width            = windowProperties_.winWidth_;
    traits->height           = windowProperties_.winHeight_;
    traits->windowDecoration = false;
    traits->doubleBuffer     = true;
    traits->sharedContext    = 0;

    // Set the graphics context for the camera
    osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
    gc->setClearColor( osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) );
    gc->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    gc->clear( );
    viewer_.getCamera()->setGraphicsContext(gc.get());

    // Set the viewport
    viewer_.getCamera()->setViewport( viewportProperties_.viewportXPos_,
                                      viewportProperties_.viewportYPos_,
                                      viewportProperties_.viewportWidth_,
                                      viewportProperties_.viewportHeight_ );


    // Set the projection matrix as perspective
    double aspectRatio;
    if(
viewportProperties_.viewportWidth_/viewportProperties_.viewportHeight_ >=
1.0 )
        aspectRatio =
viewportProperties_.viewportWidth_/viewportProperties_.viewportHeight_;
    else
        aspectRatio =
viewportProperties_.viewportHeight_/viewportProperties_.viewportWidth_;

    viewer_.getCamera()->setProjectionMatrixAsPerspective(
cameraProperties_.cameraFovy_,
                                                           aspectRatio,

cameraProperties_.cameraZNear_, cameraProperties_.cameraZFar_ );

    // Positioning the camera
    osg::Matrix camTrans;
    camTrans.makeTranslate( cameraProperties_.cameraPos_.x(),
cameraProperties_.cameraPos_.y(), -cameraProperties_.cameraPos_.z() );
    viewer_.getCamera()->setViewMatrix( camTrans );

    // tell the camera to use OpenGL frame buffer object where supported.

viewer_.getCamera()->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);

    // create texture to render to
    osg::Texture* texture = createRenderTexture(
viewportProperties_.viewportWidth_, viewportProperties_.viewportHeight_,
false );
    osg::Texture* depthTexture = createRenderTexture(
viewportProperties_.viewportWidth_, viewportProperties_.viewportHeight_,
true);

    // attach the texture and use it as the color and depth buffer.
    viewer_.getCamera()->attach(osg::Camera::COLOR_BUFFER, texture);
    viewer_.getCamera()->attach(osg::Camera::DEPTH_BUFFER, depthTexture);

Ok then I build my particle scene using osgParticle. I use a ModularEmitter
for the placer, shooter and counter.

Finally I set the osgPPU::Processor and attach all the unit I need for the
shader rendering. Then I set the viewer scene data and start the main loop
which look like this :

    osg::Group * rootGroupNode = new osg::Group();
    rootGroupNode->addChild( myParticleScene );
    rootGroupNode->addChild( myOsgPpuProcessor );
    viewer_.setSceneData( rootGroupNode_.get() );

    while (!viewer_.done())
    {
        if( checkForNewMedias() )
            updateSceneWithMedia();

        updateScene();

        // Draw the next frame.
        rendering_ = true;
        viewer_.frame();
        rendering_ = false;

        Sleep(1);
    }

And the application crash with the error message I provide you. If I comment
these lines in my viewer application :

    // Set single thread model
    //viewer_.setThreadingModel(osgViewer::Viewer::SingleThreaded);

    // tell the camera to use OpenGL frame buffer object where supported.

//viewer_.getCamera()->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);

    // create texture to render to
    //osg::Texture* texture = createRenderTexture(
viewportProperties_.viewportWidth_, viewportProperties_.viewportHeight_,
false );
    //osg::Texture* depthTexture = createRenderTexture(
viewportProperties_.viewportWidth_, viewportProperties_.viewportHeight_,
true);

    // attach the texture and use it as the color and depth buffer.
    //viewer_.getCamera()->attach(osg::Camera::COLOR_BUFFER, texture);
    //viewer_.getCamera()->attach(osg::Camera::DEPTH_BUFFER, depthTexture);

And don't attach the osgPPU::Processor to my rootGroupNode, everything works
well.

Hope I gave you enough informations, if you need more I'll provide you.

Thanks

Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080917/9fec8df7/attachment-0003.htm>


More information about the osg-users mailing list