<div dir="ltr">Robert,<br><br>I'm trying to access the images immediately after calling renderingTraversals(), so it looks like threading was my issue.  I changed the threading mode to CullDrawThreadPerContext, and everything works great (although it's a bit slower).<br>
<br>As for my application, I'm building a model-based tracker for an augmented reality system.  I'm rendering a 3D model of a real world object and comparing with live camera input, which allows me to estimate the pose of the camera in real time.  I was wrapping the image data from the osg::Images in IplImages and using OpenCV to do some image processing.  While testing, I removed all of the OpenCV code and was just checking the central pixel color, to ensure that OpenCV wasn't causing the problem.<br>
<br>Thanks for the help!<br><br>- David<br><br><div class="gmail_quote">On Mon, Jul 21, 2008 at 3:07 PM, Robert Osfield <<a href="mailto:robert.osfield@gmail.com">robert.osfield@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi David,<br>
<br>
What makes you say that you've got some kind of view matrix update problem?<br>
<br>
What are the images for?  You didn't say what they were for or how you<br>
used them, you just jammed the code in their, which given the context<br>
you gave suggested this was just a distraction.<br>
<br>
Having to double guess you logic, and what missing code you haven't<br>
told us about, could it be that you are calling renderinTraversals()<br>
and then immediatlely trying to read the Images attached to the<br>
Cameras?<br>
<br>
If so... then perhaps you have a threading synchronization issue...<br>
if the osgViewer::Viewer is running with DrawThreadPerContext or<br>
CullThreadPerCameraDrawThreadPerContext then renderingTraversals()<br>
will return before all rendering is complete.<br>
<br>
If this is the issue, then you are best to stick to SingleThreaded or<br>
CullDrawThreadPerContext as these threading models don't return before<br>
all rendering is complete.<br>
<font color="#888888"><br>
Robert.<br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
On Mon, Jul 21, 2008 at 7:52 PM, David Rubel <<a href="mailto:derubel@gmail.com">derubel@gmail.com</a>> wrote:<br>
> Robert,<br>
><br>
> Thanks for the quick response.  I'm definitely not attaching any<br>
> manipulators to the viewer, so I don't think that's the problem; just to be<br>
> sure, I set the manipulator to NULL, and it's still rendering one frame<br>
> behind.<br>
><br>
> How would double buffering work with an attached osg::Image?  Do I need to<br>
> attach two images to separate buffers?  Right now I have one set to the<br>
> depth buffer and one to the color buffer, and I expect that after calling<br>
> renderingTraversal() the rendered scene is available in the image.  Is there<br>
> something wrong with that logic?<br>
><br>
> Thanks again,<br>
><br>
> - David<br>
><br>
> On Mon, Jul 21, 2008 at 2:30 PM, Robert Osfield <<a href="mailto:robert.osfield@gmail.com">robert.osfield@gmail.com</a>><br>
> wrote:<br>
>><br>
>> Hi David,<br>
>><br>
>> I can't guess what is up with your setup, but if you do things<br>
>> correctly the viewer->getCamera()->setViewMatrix() will apply to the<br>
>> next renderingTraversal().  Is there a chance that you have a camera<br>
>> manipulator attached to your viewer?<br>
>><br>
>> Could it be that OpenGL double buffering is confusing you?<br>
>><br>
>> Robert.<br>
>><br>
>> On Mon, Jul 21, 2008 at 6:34 PM, David Rubel <<a href="mailto:derubel@gmail.com">derubel@gmail.com</a>> wrote:<br>
>> > Hi,<br>
>> ><br>
>> > I'm writing an OSG application which uses the Viewer class to<br>
>> > setup/display<br>
>> > the SceneGraph.  I'm manually updating the camera location each frame<br>
>> > using<br>
>> > the setViewMatrix() function on my camera, and this seems to be<br>
>> > introducing<br>
>> > a 1 frame delay into the loop (which is bad for my application).  The<br>
>> > first<br>
>> > time I call frame() on camera, the old camera pose is used; the second<br>
>> > time<br>
>> > I call frame, it is correct again.  I tried calling frame() twice in<br>
>> > each<br>
>> > frame, and this solves the problem, but drawing the entire scene twice<br>
>> > is<br>
>> > hardly an efficient solution.  I have two osg::Image instances attached<br>
>> > to<br>
>> > the camera (one reading color and the other reading the depth buffer,<br>
>> > which<br>
>> > I need for my application).<br>
>> ><br>
>> > I'm using OSG 2.4.0 and Visual C++ Express.<br>
>> ><br>
>> > I've been searching online for this problem, but I can't find anything<br>
>> > that<br>
>> > looks similar.  Here is an example of the problem:<br>
>> ><br>
>> > // setup viewer<br>
>> > viewer = new osgViewer::Viewer;<br>
>> > viewer->setUpViewInWindow(100,100,width,height);<br>
>> > viewer->setSceneData(osgModel);<br>
>> > viewer->getCamera()->setClearColor(osg::Vec4(1, 1, 1, 1));<br>
>> > viewer->getCamera()->setRenderOrder(osg::CameraNode::POST_RENDER);<br>
>> ><br>
>> > viewer->getCamera()->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR);<br>
>> ><br>
>> > // attach an image to the camera to be rendered each frame<br>
>> > osg::Image osg_image = new osg::Image;<br>
>> > osg_image->allocateImage(width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE);<br>
>> > viewer->getCamera()->attach(osg::Camera::COLOR_BUFFER, osg_image);<br>
>> ><br>
>> > // attach a depth image to the camera to be rendered each frame<br>
>> > osg::Image osg_depth = new osg::Image;<br>
>> > osg_depth->allocateImage(width, height, 1, GL_DEPTH_COMPONENT,<br>
>> > GL_FLOAT);<br>
>> > viewer->getCamera()->attach(osg::Camera::DEPTH_BUFFER, osg_depth);<br>
>> ><br>
>> > Main Loop<br>
>> > {<br>
>> ><br>
>> >   ...<br>
>> ><br>
>> >   // update camera pose<br>
>> >   osg::Matrixd mat = viewer->getCamera()->getViewMatrix();<br>
>> >   mat.set(newMatrix.getArray());<br>
>> >   viewer->getCamera()->setViewMatrix(mat);<br>
>> ><br>
>> >   // render the scene<br>
>> >   viewer->frame();<br>
>> ><br>
>> >   // here the images are rendered using the old camera pose<br>
>> ><br>
>> >   viewer->frame();<br>
>> ><br>
>> >   // here they are correct<br>
>> > }<br>
>> ><br>
>> > I've done some research into what the frame() function actually does,<br>
>> > and I<br>
>> > divided it into separate functions and found out that<br>
>> > renderingTraversals()<br>
>> > is the function that needs to be called twice.  For example, this code<br>
>> > works<br>
>> > as well:<br>
>> ><br>
>> > ...<br>
>> ><br>
>> >   // update camera pose<br>
>> >   osg::Matrixd mat = viewer->getCamera()->getViewMatrix();<br>
>> >   mat.set(newMatrix.getArray());<br>
>> >   viewer->getCamera()->setViewMatrix(mat);<br>
>> ><br>
>> >   // render the scene<br>
>> >   viewer->advance();<br>
>> >   viewer->eventTraversal();<br>
>> >   viewer->updateTraversal();<br>
>> >   viewer->renderingTraversals();<br>
>> ><br>
>> >   // here the images are rendered using the old camera pose<br>
>> ><br>
>> >   viewer->renderingTraversals();<br>
>> ><br>
>> >   // here they are correct<br>
>> > }<br>
>> ><br>
>> > Thanks in advance!<br>
>> ><br>
>> > - David<br>
>> > _______________________________________________<br>
>> > osg-users mailing list<br>
>> > <a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
>> ><br>
>> > <a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
>> ><br>
>> ><br>
>> _______________________________________________<br>
>> osg-users mailing list<br>
>> <a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
>> <a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
><br>
><br>
><br>
> --<br>
> David Rubel<br>
> 6th Year BS/MS Computer Science Student<br>
> Rochester Institute of Technology<br>
> <a href="mailto:der2972@rit.edu">der2972@rit.edu</a><br>
> 703.409.3464<br>
> _______________________________________________<br>
> osg-users mailing list<br>
> <a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
> <a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
><br>
><br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>David Rubel<br>6th Year BS/MS Computer Science Student<br>Rochester Institute of Technology<br><a href="mailto:der2972@rit.edu">der2972@rit.edu</a><br>703.409.3464
</div>