A follow-up:

I used an opengl tracer and found that in my app there are calls to glBegin and glEnd while in the osgviewer dump there aren't any. I am using the same models in both. glNormal3fv has 6 calls in osgviewer, yet mine has 426974. Any ideas on how that happened? I am not knowingly using DrawArrayLengths, but I DID use some DrawArrays (w/o indices).

---------- Forwarded message ----------
Date: Tue, 30 Nov 2010 14:43:20 -0500 (Eastern Standard Time)
From: Keith Parkins <[email protected]>
To: OpenSceneGraph Users <[email protected]>
Subject: FBO problem?

Hi,

I'm working on a driving simulator. I have been having problems meeting my frame rate requirements. I spent a lot of time tuning the scene, making sure that I wasn't using DrawArrayLengths, using instances of geometry, instances of blocks of buildings as a tile (5 blocks get repeated over 25 possible locations), and flattening static tranforms. In the end, I was still hitting massive cull times and massive draw(GPU) times. I wrote some portal culling type algorithm for culling blocks depending on where in the grid the camera is and I am still getting ~26Hz over large areas of the town. I finally dumped the scene out to a file and loaded that with osgviewer. I got 60Hz without a sweat; vsync is locked and there is no custom culling. The bug must be in the rendering, not the scene itself.

My main viewer has a couple of cameras hanging off of it as a switch node depending on what screen I'm in. The main view gets added like this:

getSceneData()->asGroup()->addChild(_town_view.get());

_town_view is derived from a osg::Camera and points to a screen with a texture attached to an FBO. We are projecting the screen onto a curved surface, so this is done for the geometry correction phase. The screen mesh is static.

The RTT camera is initialized like this:

_camera->setClearColor(osg::Vec4(0.0,0.0,0.0,1.0));
_camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

_camera->setViewport(0, 0, (int)TEX_W, (int)TEX_H);
_camera->setRenderOrder(osg::Camera::PRE_RENDER);
_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
_camera->setViewMatrixAsLookAt(_pos + _head_pos + _eye_pos,
        _pos + _head_pos + _eye_pos + rotate * _dir, _up);
_camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
_view_root->addChild(_camera.get());
_camera->addChild(_scene_root.get());


_scene_root is the scene that I wrote out and tested. I am using bullet to control the car physics, but right now I only have it registering a plane where the road is. In other words it's just moving the camera and doing isects with the plane, very simple.

I've stripped out all extraneous code, including physics, and just have town loading and am still having the same problem.

the scene:


class myviewer: osg::Viewer
        sceneData -> class townview : osg::Camera(NESTED_RENDER)

                townview->child - geode screen w/ RTT texture
                townview->child - RTT _camera(PRE_RENDER)
                        _camera-> _scene_root

using osgviewer:

Camera 0
Bins 2
Materials 2265
Drawables 2265
Vertices 59835

View 0
Stateset        706 5080
Group           480 2127
Transform       213 459
Geode           757 4616
Drawable        827 5040
Geometry        827 5040
Vertices        35574 1000261
Prims           21287 60407

Framerate: 60Hz


my app:

Camera 0
Bins 3
Materials 1939
Drawables 1939
Vertices 51436

View 0
Stateset        608 1982
Group           75 273
Transform       192 227
Geode           237 1032
Drawable        825 1965
Geometry        825 1965
Vertices        35374 51799
Prims           20490 29791

Framerate: 20Hz

I've walked through the culling section of the code, added cull callbacks to nodes, and the only thing I can verify is that it just takes forever culling each block in my app. My app marks which blocks are visible during an update traversal and only does so when the camera switches to another grid co-ordinate. My app should be visiting less nodes (verified in callbacks and View output above) and yet it is getting nailed. You can see that I flatten Transforms above. What is happening???? I'm at my wits end on this. I thought that I was visiting nodes more than once on the culling traversal, but my node callbacks don't show that; they just confirm that the majority of the time spent culling is in each block.

I've attached two images of the stats screen. The myapp image is using the default lighting like osgviewer which is why you can't see the skymap in it.

Please help!
-K
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to