[osg-users] osgVolume::MultipassTechnique use

Alex Taylor alextaylor at gmail.com
Tue Apr 26 13:35:52 PDT 2016


Hey all,

I'm running into a segmentation violation when I attempt to use
osgVolume::MultipassTechnique more or less as a drop in replacement for
RayTracedTechnique using OSG 3.4. My use of RayTracedTechnique works and
renders fine.

Here is an partial code listing demonstrating my use of MultipassTechnique:

*    void setVolumeProperties(osg::ref_ptr<osgVolume::Volume>
volume,osg::ref_ptr<osgVolume::VolumeTile> tile,*
*            osg::ref_ptr<osgVolume::ImageLayer> layer,
VolumePropertyManager &volumeProperties,
osg::ref_ptr<osgVolume::VolumeScene> volumeScene)*
*    {*

*        // FixedFunctionTechnique turns on GL_LIGHTING, which breaks the
color rendering.*
*        osg::StateSet* stateset = volume->getOrCreateStateSet();*

*        if (volumeProperties.volumeTechnique ==
VolumeTechnique::RayTraced){*
*            osg::ref_ptr<osgVolume::RayTracedTechnique> rayTraced = new
osgVolume::RayTracedTechnique();*
*            tile->setVolumeTechnique(rayTraced.get());*
*            osg::ref_ptr<osg::FrontFace> frontFace(new
osg::FrontFace(osg::FrontFace::CLOCKWISE));*
*            stateset->setAttribute(frontFace.get(),
osg::StateAttribute::PROTECTED);*
*            layer->addProperty(new
osgVolume::SampleDensityWhenMovingProperty(volumeProperties.sampleDensityWhenMoving));*
*            layer->addProperty(new
osgVolume::SampleDensityProperty(volumeProperties.sampleDensity));*
*        } else if (volumeProperties.volumeTechnique ==
VolumeTechnique::Multipass) {*
*            osg::ref_ptr<osgVolume::MultipassTechnique> multipass = new
osgVolume::MultipassTechnique();*
*            tile->setVolumeTechnique(multipass.get());*
*            volumeScene->addChild(volume.get());*
*            volume->getOrCreateStateSet();*
*            layer->addProperty(new osgVolume::SampleRatioProperty(1.0f));*
*            layer->addProperty(new
osgVolume::SampleRatioWhenMovingProperty(0.5f));*

*        } else if (volumeProperties.volumeTechnique ==
VolumeTechnique::FixedFunction) {*
*            tile->setVolumeTechnique(new
osgVolume::FixedFunctionTechnique());*
*            stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF |
osg::StateAttribute::OVERRIDE);*
*        } else {*
*            throw hg::PropertyException("VolumeTechnique");*
*        }*

*        layer->addProperty(new
osgVolume::TransferFunctionProperty(volumeProperties.transferFunction.get()));*
*        layer->addProperty(new
osgVolume::AlphaFuncProperty(volumeProperties.alphaFunc));*
*        if (volumeProperties.useLighting) layer->addProperty(new
osgVolume::LightingProperty);*
*        if (volumeProperties.useIsosurface) layer->addProperty(new
osgVolume::IsoSurfaceProperty(volumeProperties.alphaFunc));*
*        if (volumeProperties.useMaximumIntensityProjection)
layer->addProperty(new osgVolume::MaximumIntensityProjectionProperty());*
*    }*

The following function returns the Node * that will be passed to the
viewer. I either return a osgVolume::Volume * or osgVolume::VolumeScene *
object depending on whether I'm using multipass rendering as my Node *.

*    osg::Node* BP_createPeerHelper(Volume& v,*
*            hg::SceneClient& client,*
*            const gui_objects::Cookie& owner,*
*            hg::UpdateState& us) {*

*        osg::ref_ptr<osgVolume::Volume> volume = new osgVolume::Volume;*
*        osg::ref_ptr<osgVolume::VolumeScene> volumeScene = new
osgVolume::VolumeScene;*

*        const mxArray* data = v.getData();*
*        VolumePropertyManager volumeProperties(v,us);*

*        if (data != NULL && mxGetNumberOfDimensions(data) == 3 &&
mxGetClassID(data) == mxUINT8_CLASS) {*


*            osg::ref_ptr<osgVolume::VolumeTile> tile = new
osgVolume::VolumeTile;*
*            volume->addChild(tile.get());*

*            // If we are using FixedFunctionTechnique, we need to apply
the transfer function to get a new allocated RGBA memory on the CPU to pass
to OSG.*
*            // Otherwise, we can pass the intensity data directly to the
card. GPU shaders does the RGBA directly.*
*            osg::ref_ptr<osg::Image> intensityImage =
createTexture3D(data);*
*            osg::ref_ptr<osg::Image> image_3d =
(volumeProperties.volumeTechnique == VolumeTechnique::FixedFunction) ?*
*
osgVolume::applyTransferFunction(intensityImage.get(),volumeProperties.transferFunction.get())
:*
*
intensityImage.release();*

*            osg::ref_ptr<osgVolume::ImageLayer> layer = new
osgVolume::ImageLayer(image_3d);*
*            tile->setLayer(layer.get());*

*
setVolumeProperties(volume,tile,layer,volumeProperties,volumeScene);*

*            // Our original implementation positioned the bbox [-0.5,0.5]
in each dimension.*
*            // FixedFunctionTechnique applies the locator matrix to the a
unit cube [0 1] in each dimension.*
*            // To get the equivalent spatial referencing, apply a
translation of -0.5 to each dimension.*
*            osg::ref_ptr<osg::RefMatrix> matrix = new osg::RefMatrix();*
*            matrix->makeTranslate(-0.5,-0.5,-0.5);*

*            tile->setLocator(new osgVolume::Locator(*matrix));*

*        }*
*        else {*
*            throw hg::PropertyException("Data");*
*        }*

*        std::cout << "volumeScene pointer: " << volumeScene.get() <<
std::endl;*

*        if (volumeProperties.volumeTechnique ==
VolumeTechnique::Multipass)*
*            return volumeScene.release();*
*        else*
*            return volume.release();*

*    }*

When I execute my code that previously worked with RayTracedTechnique, I
receive the following stack trace

Stack Trace (from fault):

*[  0] 0x0000000104879d04
fl::diag::stacktrace_base::capture(fl::diag::thread_context const&,
unsigned long) at stacktrace.cpp:175 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwfl.dylib)*

*[  1] 0x000000010487cf9a void (anonymous
namespace)::terminate_impl::log<char const*>(char const* const&,
fl::diag::thread_context const&, char const*, int, char const*, bool) at
terminate.cpp:238 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwfl.dylib)*

*[  2] 0x000000010487ca09 fl::diag::terminate_log(char const*,
__darwin_ucontext const*) at lock_types.hpp:362 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwfl.dylib)*

*[  3] 0x00000001081cf0a8 (anonymous
namespace)::crash_context::generate_crash_report_(std::__1::basic_ostream<char,
std::__1::char_traits<char> >&) const at sighndl.cpp:1149 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwmcr.dylib)*

*[  4] 0x00000001081cea00 (anonymous namespace)::crash_context::ctor_() at
sighndl.cpp:1025 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwmcr.dylib)*

*[  5] 0x00000001081cd62a mnFatalSignalHandler at sighndl.cpp:729 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwmcr.dylib)*

*[  6] 0x00007fff90c31f1a _sigtramp+00000026 at
/usr/lib/system/libsystem_platform.dylib+20250 (no debugging symbols found)*

*[  7] 0x0000000000000005 [unknown function] at [unknown module] (no module
specified)*

*[  8] 0x00000001204c4e56
osgVolume::MultipassTechnique::traverse(osg::NodeVisitor&)+00000086 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgVolume.130.dylib+106070
(no debugging symbols found)*

*[  9] 0x00000001204dcbf6
osgVolume::VolumeTile::traverse(osg::NodeVisitor&)+00000438 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgVolume.130.dylib+203766
(no debugging symbols found)*

*[ 10] 0x00000001204d7c0b
osgVolume::VolumeScene::traverse(osg::NodeVisitor&)+00008827 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgVolume.130.dylib+183307
(no debugging symbols found)*

*[ 11] 0x0000000143a8daf2 osgUtil::CullVisitor::apply(osg::Group&)+00000642
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+39666
(no debugging symbols found)*

*[ 12] 0x00000001204d8a79
osgVolume::VolumeScene::accept(osg::NodeVisitor&)+00000121 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgVolume.130.dylib+187001
(no debugging symbols found)*

*[ 13] 0x00000001438749ef osg::Group::traverse(osg::NodeVisitor&)+00000047
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+522735
(no debugging symbols found)*

*[ 14] 0x0000000143a8dbf0
osgUtil::CullVisitor::apply(osg::Transform&)+00000240 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+39920
(no debugging symbols found)*

*[ 15] 0x00000001438b9499
osg::MatrixTransform::accept(osg::NodeVisitor&)+00000121 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+803993
(no debugging symbols found)*

*[ 16] 0x00000001438749ef osg::Group::traverse(osg::NodeVisitor&)+00000047
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+522735
(no debugging symbols found)*

*[ 17] 0x0000000143a8daf2 osgUtil::CullVisitor::apply(osg::Group&)+00000642
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+39666
(no debugging symbols found)*

*[ 18] 0x0000000143876049 osg::Group::accept(osg::NodeVisitor&)+00000121 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+528457
(no debugging symbols found)*

*[ 19] 0x00000001438749ef osg::Group::traverse(osg::NodeVisitor&)+00000047
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+522735
(no debugging symbols found)*

*[ 20] 0x0000000143a8f29d
osgUtil::CullVisitor::apply(osg::Camera&)+00003021 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+45725
(no debugging symbols found)*

*[ 21] 0x000000014381c209 osg::Camera::accept(osg::NodeVisitor&)+00000121
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+160265
(no debugging symbols found)*

*[ 22] 0x00000001438749ef osg::Group::traverse(osg::NodeVisitor&)+00000047
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+522735
(no debugging symbols found)*

*[ 23] 0x0000000143a8daf2 osgUtil::CullVisitor::apply(osg::Group&)+00000642
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+39666
(no debugging symbols found)*

*[ 24] 0x0000000143876049 osg::Group::accept(osg::NodeVisitor&)+00000121 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+528457
(no debugging symbols found)*

*[ 25] 0x00000001438749ef osg::Group::traverse(osg::NodeVisitor&)+00000047
at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosg.130.dylib+522735
(no debugging symbols found)*

*[ 26] 0x0000000143b486bb osgUtil::SceneView::cullStage(osg::Matrixd
const&, osg::Matrixd const&, osgUtil::CullVisitor*, osgUtil::StateGraph*,
osgUtil::RenderStage*, osg::Viewport*)+00002875 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+804539
(no debugging symbols found)*

*[ 27] 0x0000000143b47117 osgUtil::SceneView::cull()+00001399 at
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libosgUtil.130.dylib+798999
(no debugging symbols found)*

*[ 28] 0x00000001372607da
SceneRendererImpl::renderScene(hg::openscenegraph::RenderTimes&,
hg::openscenegraph::RenderCounts&, osgUtil::SceneView*, unsigned int) at
osgSceneServer.cpp:1448 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwosgserver.dylib)*

*[ 29] 0x000000013725922e
hg::openscenegraph::OsgSceneServer::cullAndDraw(int, bool, double, double)
at osgSceneServer.cpp:1809 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libmwosgserver.dylib)*

*[ 30] 0x000000011f298082
UIJ_call_OpenGLPaintFcn(gui_objects::scene_server::SceneServerProxy*, int,
bool, double, double) at SceneServerPeerEvents.cpp:56 (in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libuij.dylib)*

*[ 31] 0x000000011e589414
Java_com_mathworks_hg_peer_JavaSceneServerPeer_doDisplay at Scene.cpp:129
(in
/mathworks/devel/sbs/28/ataylor.Bmlhg_task1.j377265/matlab/bin/maci64/libnativehg.dylib)*
I was wondering if either from the stack trace or my code segments if there
is an obvious culprit in terms of my use of MultipassTechnique. I feel like
my use is consistent with the pattern established in the shipping example,
but I'm a bit stuck at the moment as far as next directions to debug my
problem...

Thanks as always for any help,

Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20160426/8e0c84ba/attachment-0002.htm>


More information about the osg-users mailing list