Hi Josiah, Try changing the pixel format from GL_FLOAT to GL_UNSIGNED_BYTE to see if it's a memory issue.
Robert. On 21 January 2014 08:56, Josiah Jideani <josh.jide...@gmail.com> wrote: > Hi, > > I am involved in a project where I have to build a 3D image from processed > ultrasound data. The 3D image is built up as a stack of 2D images. I > inherited the code to build the 3D volume in Qt 4.7.1 on a linux machine. > The code has been working fine until I developed a new imaging algorithm > and had to increase the size of the volume. Here is the code snippet that > sets up the viewer: > > >> //image >> osg::Image* image = new osg::Image; >> image->allocateImage(_S, _T, _R, GL_RGBA, GL_FLOAT); >> >> for(int s = 0; s < image->s(); s++) >> { >> for(int t = 0; t < image->t(); t++) >> { >> for(int r = 0; r < image->r(); r++) >> { >> float*_data = (float*)(image->data(s, t, r)); >> >> _data[0] = 0.0f; >> _data[1] = 0.0f; >> _data[2] = 1.0f; >> _data[3] = 0.1f; >> } >> } >> } >> >> float image_s = (float)(image->s()); >> float image_t = (float)(image->t())/10.0f; >> float image_r = (float)(image->r()); >> >> osg::ref_ptr<osg::RefMatrix> matrix = new osg::RefMatrix(); >> >> osgVolume::Locator* locator = new osgVolume::Locator(*matrix.get()); >> locator->setTransformAsExtents(0.0f, 0.0f, image_s, image_t, 0.0f, >> image_r); >> >> osgVolume::Layer* layer = new osgVolume::ImageLayer(image); >> layer->setLocator(locator); >> >> osgVolume::VolumeTile* tile = new osgVolume::VolumeTile; >> tile->setLocator(locator); >> tile->setLayer(layer); >> tile->setEventCallback(new osgVolume::PropertyAdjustmentCallback()); >> >> hss::ShaderModel shaderModel = hss::StanderdShaderModel; >> hss::ShaderTechnique shaderTechnique = hss::RayTracedShaderTechnique; >> float alphaFunc=0.001; >> >> switch (shaderTechnique) >> { >> case (hss::RayTracedShaderTechnique): >> { >> osgVolume::SwitchProperty* sp = new osgVolume::SwitchProperty; >> sp->setActiveProperty(0); >> >> osgVolume::AlphaFuncProperty* ap = new >> osgVolume::AlphaFuncProperty(alphaFunc); >> osgVolume::SampleDensityProperty* sd = new >> osgVolume::SampleDensityProperty(0.005); >> osgVolume::TransparencyProperty* tp = new >> osgVolume::TransparencyProperty(1.0); >> osgVolume::TransferFunctionProperty* tfp = 0; >> >> { >> // Standard >> osgVolume::CompositeProperty* cp = new >> osgVolume::CompositeProperty; >> cp->addProperty(ap); >> cp->addProperty(sd); >> cp->addProperty(tp); >> if (tfp) cp->addProperty(tfp); >> >> sp->addProperty(cp); >> } >> >> { >> // Light >> osgVolume::CompositeProperty* cp = new >> osgVolume::CompositeProperty; >> cp->addProperty(ap); >> cp->addProperty(sd); >> cp->addProperty(tp); >> cp->addProperty(new osgVolume::LightingProperty); >> if (tfp) cp->addProperty(tfp); >> >> sp->addProperty(cp); >> } >> >> { >> // IsoSurface >> osgVolume::CompositeProperty* cp = new >> osgVolume::CompositeProperty; >> cp->addProperty(sd); >> cp->addProperty(tp); >> cp->addProperty(new >> osgVolume::IsoSurfaceProperty(alphaFunc)); >> if (tfp) cp->addProperty(tfp); >> >> sp->addProperty(cp); >> } >> >> { >> // MaximumIntensityProjection >> osgVolume::CompositeProperty* cp = new >> osgVolume::CompositeProperty; >> cp->addProperty(ap); >> cp->addProperty(sd); >> cp->addProperty(tp); >> cp->addProperty(new >> osgVolume::MaximumIntensityProjectionProperty); >> if (tfp) cp->addProperty(tfp); >> >> sp->addProperty(cp); >> } >> >> switch(shaderModel) >> { >> case(hss::StanderdShaderModel): >> sp->setActiveProperty(0); break; >> case(hss::LightShaderModel): >> sp->setActiveProperty(1); break; >> case(hss::IsosurfaceShaderModel): >> sp->setActiveProperty(2); break; >> case(hss::MaximumIntensityProjectionShaderModel): >> sp->setActiveProperty(3); break; >> } >> layer->addProperty(sp); >> >> tile->setVolumeTechnique(new osgVolume::RayTracedTechnique); >> } >> break; >> >> default: >> { >> layer->addProperty(new >> osgVolume::AlphaFuncProperty(alphaFunc)); >> tile->setVolumeTechnique(new >> osgVolume::FixedFunctionTechnique); >> } >> } >> >> //volume >> osgVolume::Volume* volume = new osgVolume::Volume; >> volume->addChild(tile); >> >> osg::Group* rootBox = new osg::Group; >> rootBox->addChild(volume); > > > The typical values for _S, _T, and _R used in the allocateImage() function > call are 127, 2048 and 63 respectively and they are represent the exact > size of the data matrix. > > I observed that when _T is increased to 4096, the mapping from data to the > 3D image becomes distorted and the image seems to shift to the 2nd half of > the volume. While debugging I noticed that when I only initialize the > pixels in the first half of the 3D image ( for(int t = 0; t < image->t()/2; > t++) ), I get something that looks like Fig. 1 instead of Fig. 2. In Fig. > 1, it seems to be initializing 32 slices of the entire volume instead of > the all 63 slices of only the first half (like in Fig 2), as a result the > location of the representation of my targets in the 3D image does not > correlate with that actual location of the targets in the real world. > > Could you help me understand why this is happening and the possible > solutions to this? I am quite new to OSG so I request that you be patient > with me if I ask dumb questions? > > PS: I have an nvidia geforce GTX 480 graphics card on the system. > > Thank you > > > Regards, > > Josiah > > _______________________________________________ > 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