I've got a camera set up to perform a pre-render pass, so I can generate 
a shadow map for the scene of interest. I have verified that the camera 
is running via the PostDrawCallback, but the resulting image is the same 
even though the scene is changing between images. The PostDrawCallback 
merely calls dirty() on the image - this code results in a static image. 
Anyone have any clues what is wrong with this code?

Thanks in advance,


ref_ptr<Camera> m_prerenderCamera;
ref_ptr<Image> m_shadowImage;
ref_ptr<Texture2D> m_shadowMap;
const int TextureSize = 1024; 
m_prerenderCamera->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);
m_prerenderCamera->setClearColor(Vec4(1.0f, 0.0f, 1.0f, 1.0f));
m_prerenderCamera->setClearMask(GL_DEPTH_BUFFER_BIT  | GL_COLOR_BUFFER_BIT);
  m_prerenderCamera->setComputeNearFarMode(Camera::DO_NOT_COMPUTE_NEAR_FAR);

m_prerenderCamera->setReferenceFrame(Transform::ABSOLUTE_RF);
m_prerenderCamera->setProjectionMatrixAsPerspective(90.0, 1024.0/768.0, 
1.0, 100.0);
m_prerenderCamera->setViewMatrix(Matrix::identity());
m_prerenderCamera->setViewport(0, 0, TextureSize, TextureSize);
m_prerenderCamera->setRenderOrder(Camera::PRE_RENDER);

  {
    StateSet* ss = m_prerenderCamera->getOrCreateStateSet();

    osg::Depth* depth = new osg::Depth;
    ss->setAttributeAndModes(depth, StateAttribute::ON);
  }

m_shadowImage->allocateImage(TextureSize, TextureSize, 1, 
GL_DEPTH_COMPONENT, GL_FLOAT);

m_prerenderCamera->attach(Camera::DEPTH_BUFFER, m_shadowImage.get());
m_prerenderCamera->addChild(m_maskingScene.get());

m_shadowMap->setImage(m_shadowImage.get());
m_prerenderCamera->setPostDrawCallback(new CameraCallback(m_shadowImage));

m_shadowMap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER);
m_shadowMap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER);
m_shadowMap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_BORDER);
{
  StateSet* ss = m_projectedScene->getOrCreateStateSet();
  ss->setTextureAttributeAndModes(m_shadowUnit, m_shadowMap.get(), 
StateAttrib
  ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
  ss->setMode(GL_BLEND, osg::StateAttribute::ON);
}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to