Hi,
while trying to implement rtt textures,
I came a cross a situation that I can not solve in anyway.
A camera (this camera is a post render camera (which was added to scenegraph)
which draws to frame buffer.and meanwhile, the main camera (of the viewer)
produces a texture (via fbo) that this camera uses to draw to frame buffer)
This camera(post render camera) should draw two different geometries; a simple
quad, which is used to render a textured quad with orthographic projection (to
draw the main camera's fbo's generated texture in to the frame buffer), and
secondly a geometry(a sphere) with perspective projection to be drawn to the
frame buffer afterwards.
To handle different projections, I reimplemented the drawcallback of the first
geometry (which needed orthographic projection) and did nothing for the sphere
which used the camera's original projection (perspective projection). However,
when the sphere is visible, sphere is not rendered as it should be, the whole
scene becomes the sphere's color, when the sphere is visible, and nothing is
drawn when the sphere is not visible. There is no sphere shape at all. I belive
that the drawcallback of the first geometry does something wrong which produces
this behavior, cause when the drawcallback is not done, the first geom is not
drawn but the sphere is drawn as it should be. The following code shows my
drawcallback of the first geometry,
class TmpDrawCallback : public osg::Drawable::DrawCallback
{
public:
TmpDrawCallback() : osg::Drawable::DrawCallback(){
projectionMatrix=new
osg::RefMatrix(osg::Matrix::ortho(0,1,0,1,0,1));
osg::Matrix m;
m.getLookAt(osg::Vec3d(0,0,0),osg::Vec3d(0,0,-2),osg::Vec3d(0,1,0));
modelViewMatrix=new osg::RefMatrix(m);
}
~TmpDrawCallback() {}
void drawImplementation (osg::RenderInfo& ri, const
osg::Drawable* dr) const;
osg::RefMatrix * projectionMatrix;
osg::RefMatrix * modelViewMatrix;
};
void TmpDrawCallback::drawImplementation (osg::RenderInfo& ri, const
osg::Drawable* dr) const
{
osg::RefMatrix * originalPm=new
osg::RefMatrix(ri.getState()->getProjectionMatrix());
osg::RefMatrix * originalMvm=new
osg::RefMatrix(ri.getState()->getModelViewMatrix());
ri.getState()->applyProjectionMatrix(projectionMatrix);
ri.getState()->applyModelViewMatrix(modelViewMatrix);
dr->drawImplementation(ri);
ri.getState()->applyProjectionMatrix(originalPm);
ri.getState()->applyModelViewMatrix(originalMvm);
}
Does anyone see the flaw here? Or, is there any other way of implementing 2
different projections for the samecamera(without reimplementing the
drawcallback)?
Thanks in advance
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org