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

Reply via email to