Re: [osg-users] Shader Update Latency?!
Again, Okay this is definitely not a bug, but it seems quite a common pitfall to say the least. Instead of using viewer.frame(), which is a helper function that "calls advance(), eventTraversal(), updateTraversal(), renderingTraversals()" use the following. Code: viewer.advance(); viewer.eventTraversal(); viewer.updateTraversal(); updateShaders(); viewer.renderingTraversals(); This fixed my case of choppy shader updating, due to the slow viewmatrices update. Cheers, Johny -- Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=70157#70157 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Hi, This problem affects my shaders, since all my shaders rely on the correct view matrices. robertosfield wrote: > > By default the osgViewer::Viewer/CompositeViewer runs the update > traversal before the camera matrices are set, this is done as camera > manipulators might be tracking movement of nodes in the scene which > are update in the update traversal so has to be run second. > > One thing you could do is set the camera view matrix prior to the > updateTraversal() method is called, or do the update of your Uniforms > explicitly after the updateTraversal(). How can I run a function after this updateTraversal that you speak of? Thank you! Cheers, Johny -- Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=70156#70156 ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Hi Guo, On Wed, Jan 12, 2011 at 7:04 AM, Guo Chow guo.c...@gmail.com wrote: I encounter a similar latency problem when I try to update a uniform using camera's view matrix in the uniform's callback. Since this uniform is needed to compute only once per frame, I decide to compute it on CPU before it's submitted to GPU. It seems that when the uniform's callback is called, the camera has not been updated yet, right? Currently I solve this problem by updating the uniform in a PreDrawCallback of the camera. But is this a graceful way to achieve it? By default the osgViewer::Viewer/CompositeViewer runs the update traversal before the camera matrices are set, this is done as camera manipulators might be tracking movement of nodes in the scene which are update in the update traversal so has to be run second. One thing you could do is set the camera view matrix prior to the updateTraversal() method is called, or do the update of your Uniforms explicitly after the updateTraversal(). Robert. ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Robert Osfield robert.osfi...@... writes: Hi Thorsten, By default the OSG computes the near/far planes on the fly during the cull traversal on every single frame. You can disable this. Alternatively you could just use the gl_ProjectionMatrix directly on the GPU to get the near/far planes - this is how I'd do it, far more flexible and never needs any additional uniforms or callbacks. Robert. On Wed, Dec 1, 2010 at 6:15 PM, Thorsten Roth thorsten.r...@... wrote: Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me -Thorsten ___ osg-users mailing list osg-us...@... http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org Hi Robert, I encounter a similar latency problem when I try to update a uniform using camera's view matrix in the uniform's callback. Since this uniform is needed to compute only once per frame, I decide to compute it on CPU before it's submitted to GPU. It seems that when the uniform's callback is called, the camera has not been updated yet, right? Currently I solve this problem by updating the uniform in a PreDrawCallback of the camera. But is this a graceful way to achieve it? Thanks in advance. Guo ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
[osg-users] Shader Update Latency?!
Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me :-) -Thorsten ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Have you set the data variance of the Uniform object -- and the containing StateSet object -- to Object::DYNAMIC? Tim On Wed, Dec 1, 2010 at 7:15 PM, Thorsten Roth thorsten.r...@alsvartr.dewrote: Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me :-) -Thorsten ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
I have actually tried it now, but it made no difference :-( -Thorsten Am 01.12.2010 19:22, schrieb Tim Moore: Have you set the data variance of the Uniform object -- and the containing StateSet object -- to Object::DYNAMIC? Tim On Wed, Dec 1, 2010 at 7:15 PM, Thorsten Roth thorsten.r...@alsvartr.de mailto:thorsten.r...@alsvartr.de wrote: Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me :-) -Thorsten ___ osg-users mailing list osg-users@lists.openscenegraph.org mailto:osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Hi Thorsten, By default the OSG computes the near/far planes on the fly during the cull traversal on every single frame. You can disable this. Alternatively you could just use the gl_ProjectionMatrix directly on the GPU to get the near/far planes - this is how I'd do it, far more flexible and never needs any additional uniforms or callbacks. Robert. On Wed, Dec 1, 2010 at 6:15 PM, Thorsten Roth thorsten.r...@alsvartr.de wrote: Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me :-) -Thorsten ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Shader Update Latency?!
Hi Robert, thank you for this information. I did not know that I could do this, as I'm an absolute newbie concerning shader stuff and was happy that I just got it to work somehow ;) I will try the approach with gl_ProjectionMatrix tomorrow, thank you :) -Thorsten Am 01.12.2010 20:51, schrieb Robert Osfield: Hi Thorsten, By default the OSG computes the near/far planes on the fly during the cull traversal on every single frame. You can disable this. Alternatively you could just use the gl_ProjectionMatrix directly on the GPU to get the near/far planes - this is how I'd do it, far more flexible and never needs any additional uniforms or callbacks. Robert. On Wed, Dec 1, 2010 at 6:15 PM, Thorsten Roththorsten.r...@alsvartr.de wrote: Hi, I currently have a problem with a shader update callback I do not understand. I have a vertex and fragment shader which calculate linear depth in [0,1] for me, also respecting dynamic clipping planes. To achieve this, I pass zNear and zFar as uniform parameters to the shader. To have them updated, I have the following callback methods (zFar is looking accordingly): class UpdateShaderZNear: public osg::Uniform::Callback { public: virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv) { double x, zNear; viewer-getCamera()-getProjectionMatrixAsPerspective(x,x,zNear,x); uniform-set((float)zFar); } }; Now when I move my camera towards and away from the object, it seems like the shader update is one frame (or so) too late, as I get values that do not correspond to the [0,1]-normalization and the problem disappears as soon as the camera stops. Is there any reason for that/does anyone have an idea what I'm doing wrong? If more information or code is necessary, just tell me :-) -Thorsten ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org