Hi Max, I would not recommend trying to to use rendering to do picking, it requires a round trip to the graphics card making it a very slow way to do picking. If you can do picking on the CPU.
Robert. On 27 September 2013 17:34, Max Bandazian <[email protected]> wrote: > Hi, > > I'm trying to implement picking via rendering a single frame with unique > colors set on each object in the scene, and getting segfaults in the > graphics driver. I'm about out of debugging ideas, so any help would be > appreciated. The general outline is I create a viewer, give it a shared > context, set it to render to an FBO and add an image, and render one frame, > at which point it immediately segfaults. > > When I run this in gDEBugger, I can see that there are textures allocated > in the shared context, but none of them have any data; this is probably > what's causing the crash, but since the corresponding textures in the main > context do have data, I'm not sure what the problem is. Source is below, > simplified a little for readability; hopefully I'm just doing something > dumb and easily spotted. > > Thanks, > Max Bandazian > > > osg::Image* image = new osg::Image; > { > mainViewer->stopThreading(); > > osg::GraphicsContext* mainContext = > mainViewer->getCamera()->getGraphicsContext(); > osg::ref_ptr<osg::GraphicsContext::Traits> traits = new > osg::GraphicsContext::Traits; > traits->doubleBuffer = false; > traits->vsync = false; > traits->x = 0; > traits->y = 0; > traits->width = widthPx; > traits->height = heightPx; > traits->windowDecoration = false; > traits->pbuffer = true; > traits->red = 8; > traits->green = 8; > traits->blue = 8; > traits->alpha = 8; > traits->depth = 24; > traits->sharedContext = mainContext; > > osg::ref_ptr<osg::GraphicsContext> pickContext = > osg::GraphicsContext::createGraphicsContext(traits.get()); > > > osg::Texture2D* tex = new osg::Texture2D; > tex->setTextureSize(PICK_TEXTURE_DIMENSION, PICK_TEXTURE_DIMENSION); > > // Set up the viewer > osg::ref_ptr<osgViewer::Viewer> pickView = new osgViewer::Viewer(); > pickView->setThreadingModel(osgViewer::ViewerBase::SingleThreaded); > > osg::Camera* pickCamera = pickView->getCamera(); > pickCamera->setGraphicsContext(pickContext.get()); > > pickCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); > > pickCamera->setProjectionMatrix(sceneCamera->getProjectionMatrix()); > pickCamera->setViewport(0, 0, PICK_TEXTURE_DIMENSION, > PICK_TEXTURE_DIMENSION); > > pickCamera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); > pickCamera->setClearMask( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT > ); > > osg::Shader* vs = new osg::Shader(osg::Shader::VERTEX); > vs->loadShaderSourceFromFile("pick_shader.vert"); > osg::Shader* fs = new osg::Shader(osg::Shader::FRAGMENT); > fs->loadShaderSourceFromFile("pick_shader.frag"); > > osg::Program* program = new osg::Program; > program->addBindAttribLocation("attr_weight_array", > osg::Drawable::ATTRIBUTE_6); > program->addBindAttribLocation("attr_index_array", > osg::Drawable::ATTRIBUTE_7); > program->addBindAttribLocation("attr_tangent", > osg::Drawable::SECONDARY_COLORS); > program->addShader(vs); > program->addShader(fs); > > pickView->setSceneData(skinnedMeshRoot); > > pickCamera->getOrCreateStateSet()->setAttributeAndModes(program, > osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); > > osg::ShadeModel* sm = new osg::ShadeModel(osg::ShadeModel::FLAT); > pickCamera->getOrCreateStateSet()->setAttributeAndModes(sm, > osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); > > // attach an image to the view > image->allocateImage(PICK_TEXTURE_DIMENSION, PICK_TEXTURE_DIMENSION, > 1, GL_RGBA, GL_UNSIGNED_BYTE); > pickCamera->attach(osg::Camera::COLOR_BUFFER, image); > > // finalize and render > pickView->realize(); > pickView->setCameraManipulator(0); > pickView->frame(); > } > mainViewer()->startThreading(); > > return image; > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

