Show
Ignore:
Timestamp:
09/26/08 13:29:00 (6 years ago)
Author:
robert
Message:

Added --isosurface and --mip paths into osgvolume example, and added associted shaders

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgvolume/osgvolume.cpp

    r8936 r8946  
    5959 
    6060typedef std::vector< osg::ref_ptr<osg::Image> > ImageList; 
     61 
     62enum ShadingModel 
     63{ 
     64    Standard, 
     65    Light, 
     66    Isosurface, 
     67    MaximumIntensityProjection 
     68}; 
    6169 
    6270//  example ReadOperator 
     
    803811}; 
    804812 
    805 osg::Node* createShaderModel(osg::ref_ptr<osg::Image>& image_3d,  
     813osg::Node* createShaderModel(ShadingModel shadingModel, 
     814                       osg::ref_ptr<osg::Image>& image_3d,  
    806815                       osg::Image* normalmap_3d, 
    807816                       osg::TransferFunction1D* tf, 
     
    809818                       float xSize, float ySize, float zSize, 
    810819                       float /*xMultiplier*/, float /*yMultiplier*/, float /*zMultiplier*/, 
    811                        unsigned int /*numSlices*/=500, float /*sliceEnd*/=1.0f, float alphaFuncValue=0.02f, bool maximumIntensityProjection = false) 
     820                       unsigned int /*numSlices*/=500, float /*sliceEnd*/=1.0f, float alphaFuncValue=0.02f) 
    812821{ 
    813822    osg::Texture::FilterMode minFilter = osg::Texture::LINEAR; 
     
    841850        program->addShader(new osg::Shader(osg::Shader::VERTEX, volume_vert)); 
    842851    } 
    843      
    844852 
    845853    if (!(normalmap_3d && tf)) 
     
    872880     
    873881 
    874     if (normalmap_3d) 
     882    if (shadingModel==MaximumIntensityProjection) 
     883    { 
     884        if (tf) 
     885        { 
     886            osg::Texture1D* texture1D = new osg::Texture1D; 
     887            texture1D->setImage(tf->getImage());     
     888            stateset->setTextureAttributeAndModes(1,texture1D,osg::StateAttribute::ON); 
     889 
     890            osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "volume_tf_mip.frag"); 
     891            if (fragmentShader) 
     892            { 
     893                program->addShader(fragmentShader); 
     894            } 
     895            else 
     896            { 
     897                #include "volume_tf_mip_frag.cpp" 
     898                program->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_tf_mip_frag)); 
     899            } 
     900 
     901            osg::Uniform* tfTextureSampler = new osg::Uniform("tfTexture",1); 
     902            stateset->addUniform(tfTextureSampler); 
     903 
     904        } 
     905        else 
     906        {     
     907            osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "volume_mip.frag"); 
     908            if (fragmentShader) 
     909            { 
     910                program->addShader(fragmentShader); 
     911            } 
     912            else 
     913            { 
     914                #include "volume_mip_frag.cpp" 
     915                program->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_mip_frag)); 
     916            } 
     917        } 
     918    } 
     919    else if (shadingModel==Isosurface) 
     920    { 
     921        osg::Uniform* normalMapSampler = new osg::Uniform("normalMap",1); 
     922        stateset->addUniform(normalMapSampler); 
     923 
     924        osg::Texture3D* normalMap = new osg::Texture3D; 
     925        normalMap->setImage(normalmap_3d);     
     926        stateset->setTextureAttributeAndModes(1,normalMap,osg::StateAttribute::ON); 
     927 
     928        if (tf) 
     929        { 
     930            osg::Texture1D* texture1D = new osg::Texture1D; 
     931            texture1D->setImage(tf->getImage());     
     932            stateset->setTextureAttributeAndModes(0,texture1D,osg::StateAttribute::ON); 
     933 
     934            osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "volume-tf-iso.frag"); 
     935            if (fragmentShader) 
     936            { 
     937                program->addShader(fragmentShader); 
     938            } 
     939            else 
     940            { 
     941                #include "volume_tf_iso_frag.cpp" 
     942                program->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_tf_iso_frag)); 
     943            } 
     944 
     945            osg::Uniform* tfTextureSampler = new osg::Uniform("tfTexture",0); 
     946            stateset->addUniform(tfTextureSampler); 
     947 
     948        } 
     949        else 
     950        {     
     951            osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "volume_iso.frag"); 
     952            if (fragmentShader) 
     953            { 
     954                program->addShader(fragmentShader); 
     955            } 
     956            else 
     957            { 
     958                #include "volume_iso_frag.cpp" 
     959                program->addShader(new osg::Shader(osg::Shader::FRAGMENT, volume_iso_frag)); 
     960            } 
     961        } 
     962    } 
     963    else if (normalmap_3d) 
    875964    { 
    876965        osg::notify(osg::NOTICE)<<"Setting up normalmapping shader"<<std::endl; 
     
    10381127} 
    10391128 
    1040 osg::Node* createModel(osg::ref_ptr<osg::Image>& image_3d,  
     1129osg::Node* createModel(ShadingModel shadeModel, 
     1130                       osg::ref_ptr<osg::Image>& image_3d,  
    10411131                       osg::ref_ptr<osg::Image>& normalmap_3d, 
    10421132                       osg::Texture::InternalFormatMode internalFormatMode, 
     
    11341224    stateset->setAttributeAndModes(material); 
    11351225     
    1136     if (maximumIntensityProjection) 
     1226    if (shadeModel==MaximumIntensityProjection) 
    11371227    { 
    11381228        stateset->setAttribute(new osg::BlendFunc(osg::BlendFunc::ONE, osg::BlendFunc::ONE)); 
     
    12151305        else 
    12161306        { 
    1217             osg::ref_ptr<osg::Image> normalmap_3d = createNormalMapTexture(image_3d.get()); 
    12181307            osg::Texture3D* bump_texture3D = new osg::Texture3D; 
    12191308            bump_texture3D->setResizeNonPowerOfTwoHint(false); 
     
    17151804 
    17161805 
     1806     
     1807    ShadingModel shadingModel = Standard; 
     1808     
     1809    bool maximumIntensityProjection = false; 
     1810    while(arguments.read("--mip")) shadingModel =  MaximumIntensityProjection; 
     1811 
    17171812    bool createNormalMap = false; 
    1718     while (arguments.read("-n")) createNormalMap=true; 
    1719      
    1720     bool maximumIntensityProjection = false; 
    1721     while(arguments.read("--mip")) maximumIntensityProjection = true; 
     1813    while (arguments.read("-n"))  
     1814    { 
     1815        shadingModel = Light; 
     1816        createNormalMap=true; 
     1817    } 
     1818 
     1819    while (arguments.read("--isosurface"))  
     1820    { 
     1821        shadingModel = Isosurface; 
     1822        createNormalMap=true; 
     1823    } 
    17221824 
    17231825    float xSize=1.0f, ySize=1.0f, zSize=1.0f; 
     
    20102112    if (useShader) 
    20112113    { 
    2012         rootNode = createShaderModel(image_3d, normalmap_3d.get(),  
     2114        rootNode = createShaderModel(shadingModel,  
     2115                               image_3d, normalmap_3d.get(),  
    20132116                               (gpuTransferFunction ? transferFunction.get() : 0), 
    20142117                               internalFormatMode, 
    20152118                               xSize, ySize, zSize, 
    20162119                               xMultiplier, yMultiplier, zMultiplier, 
    2017                                numSlices, sliceEnd, alphaFunc, maximumIntensityProjection); 
     2120                               numSlices, sliceEnd, alphaFunc); 
    20182121    } 
    20192122    else 
    20202123    { 
    2021         rootNode = createModel(image_3d, normalmap_3d,  
     2124        rootNode = createModel(shadingModel, 
     2125                               image_3d, normalmap_3d,  
    20222126                               internalFormatMode, 
    20232127                               xSize, ySize, zSize, 
    20242128                               xMultiplier, yMultiplier, zMultiplier, 
    2025                                numSlices, sliceEnd, alphaFunc, maximumIntensityProjection); 
     2129                               numSlices, sliceEnd, alphaFunc); 
    20262130    } 
    20272131