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

Reply via email to