Harash, now I understand what you were talking about.  I am attempting to use 
the hdr example from osgPPU to perform the following procedure you outlined.  
However, I am having difficulty in breaking out the blur section of the hdr 
example provided with osgPPU.

Could you possibly tell me what I am missing from my code here?

Code:

#include <stdafx.h>
#include <osgViewer/Viewer> 
#include <osgDB/ReadFile> 
#include <osg/ShapeDrawable> 
#include <iostream> 

#include <osg/Texture2D> 
#include <osg/Camera> 

#include <osgPPU/Processor.h> 
#include <osgPPU/UnitInOut.h> 
#include <osgPPU/UnitOut.h> 
#include <osgPPU/UnitTexture.h> 
#include <osgPPU/ShaderAttribute.h> 
#include <osgPPU/Unit.h>
#include <osgPPU/UnitInOut.h>
#include <osgPPU/UnitText.h>
#include <osgPPU/UnitInResampleOut.h>
#include <osgPPU/UnitInMipmapOut.h>
#include <osgPPU/UnitOutCapture.h>
#include <osgPPU/UnitBypass.h>

#include <osgDB/ReaderWriter>
#include <osgDB/ReadFile>


osg::Texture* createRenderTexture3(int tex_width, int tex_height, bool depth) 
{ 
   // create simple 2D texture 
   osg::Texture2D* texture2D = new osg::Texture2D; 
   texture2D->setTextureSize(tex_width, tex_height); 
   texture2D->setResizeNonPowerOfTwoHint(false); 
   texture2D->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); 
   texture2D->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); 
   texture2D->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER); 
   texture2D->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER); 
   texture2D->setBorderColor(osg::Vec4(1.0f,1.0f,1.0f,1.0f)); 

   osg::Image *image = new osg::Image(); 

   image->allocateImage(tex_width, tex_height, 1, GL_RGBA, GL_FLOAT); 
   memset(image->data(), 0, image->getTotalSizeInBytes()); 

   texture2D->setImage(image); 
   texture2D->setUnRefImageDataAfterApply(true); 

   // setup float format 
   if (!depth) 
   { 
      texture2D->setInternalFormat(GL_RGBA16F_ARB); 
      texture2D->setSourceFormat(GL_RGBA); 
      texture2D->setSourceType(GL_FLOAT); 
   }else{ 
      texture2D->setInternalFormat(GL_DEPTH_COMPONENT); 
   } 

   return texture2D; 
} 


//-------------------------------------------------------------------------- 
//         Quad 
//-------------------------------------------------------------------------- 

osg::Drawable* createSquare2(float textureCoordMax=1.0f) 
{ 
   // set up the Geometry. 
   osg::Geometry* geom = new osg::Geometry; 

   osg::Vec3Array* coords = new osg::Vec3Array(4); 
   (*coords)[0].set(-1.0f,0.0f,1.0f); 
   (*coords)[1].set(-1.0f,0.0f,-1.0f); 
   (*coords)[2].set(1.0f,0.0f,-1.0f); 
   (*coords)[3].set(1.0f,0.0f,1.0f); 
   geom->setVertexArray(coords); 

   osg::Vec3Array* norms = new osg::Vec3Array(1); 
   (*norms)[0].set(0.0f,-1.0f,0.0f); 
   geom->setNormalArray(norms); 
   geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 

   osg::Vec2Array* tcoords = new osg::Vec2Array(4); 
   (*tcoords)[0].set(0.0f,0.0f); 
   (*tcoords)[1].set(0.0f,textureCoordMax); 
   (*tcoords)[2].set(textureCoordMax,textureCoordMax); 
   (*tcoords)[3].set(textureCoordMax,0.0f); 
   geom->setTexCoordArray(0,tcoords); 

   geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 

   return geom; 
} 

//-------------------------------------------------------------------------- 
int main(int argc, char **argv) 
{ 
   // construct the scene 
   osg::Group* node = new osg::Group(); 
   osg::Drawable* quad = createSquare2(); 
   osg::Geode* geode = new osg::Geode(); 
   geode->addDrawable(quad); 
   node->addChild(geode); 

   // construct the viewer. 
   osgViewer::Viewer* viewer = new osgViewer::Viewer(); 
   unsigned int screenWidth; 
   unsigned int screenHeight; 
   
osg::GraphicsContext::getWindowingSystemInterface()->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
 screenWidth, screenHeight); 
   unsigned int windowWidth = 640; 
   unsigned int windowHeight = 480; 
   viewer->setUpViewInWindow((screenWidth-windowWidth)/2, 
(screenHeight-windowHeight)/2, windowWidth, windowHeight); 
   viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); 

   // stateset 
   osg::StateSet *stateSet = quad->getOrCreateStateSet(); 

   // texture 
   osg::Texture2D* texture = new osg::Texture2D; 
   osg::Image* image = 
osgDB::readImageFile("C:\\projects\\exampleOsg1\\Data\\Images\\lz.rgb"); 
   if (!image) 
   { 
      std::cout << " couldn't find texture, quiting." << std::endl; 
      return 1; 
   } 
   texture->setImage(image); 
   osgPPU::UnitTexture* unitTexture= new osgPPU::UnitTexture(texture); 

   
//----------------------------------------------------------------------------------------
 
   // First 
   osgPPU::UnitInOut* unitInOut= new osgPPU::UnitInOut(); 
   unitInOut->setInputToUniform(unitTexture,"textureNameInShader",true); 
   osgPPU::ShaderAttribute* shaderAttribute= new osgPPU::ShaderAttribute(); 
   { 
      osg::Shader* shader= new osg::Shader(osg::Shader::FRAGMENT); 
      const char* shaderSource= 
         "uniform sampler2D textureNameInShader;\n" 
         "void main()\n" 
         "{\n" 
         "  gl_FragColor=texture2D(textureNameInShader,gl_TexCoord[0].st);\n" 
         "}"; 
      shader->setShaderSource(shaderSource); 
      shaderAttribute->addShader(shader); 
      shaderAttribute->setName("nomShaderAttribute"); 
      shaderAttribute->add("textureNameInShader", osg::Uniform::SAMPLER_2D); 
      shaderAttribute->set("textureNameInShader", 0); 

      unitInOut->setName("unitName"); 
      unitInOut->getOrCreateStateSet()->setAttributeAndModes(shaderAttribute); 
      unitInOut->setInputTextureIndexForViewportReference(-1);//first UnitInOut 
you set -1 
   } 
   
//----------------------------------------------------------------------------------------
 

   
//----------------------------------------------------------------------------------------
 
   // Second 
   osgPPU::UnitInOut* unitInOut2= new osgPPU::UnitInOut(); 
   unitInOut2->setInputToUniform(unitInOut,"textureNameInShader2",true); 
   osgPPU::ShaderAttribute* shaderAttribute2= new osgPPU::ShaderAttribute(); 
   { 
      osg::Shader* shader2= new osg::Shader(osg::Shader::FRAGMENT); 
      const char* shaderSource2= 
         "uniform sampler2D textureNameInShader2;\n" 
         "void main()\n" 
         "{\n" 
         "  
gl_FragColor=texture2D(textureNameInShader2,gl_TexCoord[0].st)+vec4(0.0,0.0,0.5,1.0);\n"
 
         "}"; 
      shader2->setShaderSource(shaderSource2); 
      shaderAttribute2->addShader(shader2); 
      shaderAttribute2->setName("nomShaderAttribute2"); 
      shaderAttribute2->add("textureNameInShader2", osg::Uniform::SAMPLER_2D); 
      shaderAttribute2->set("textureNameInShader2", 0); 

      unitInOut2->setName("unitName2"); 
      
unitInOut2->getOrCreateStateSet()->setAttributeAndModes(shaderAttribute2); 
      unitInOut2->setInputTextureIndexForViewportReference(0);//all UnitInOut 
following you set 0 
   } 

  //--------------------------------------------------------------------------

  float mHDRBlurSigma = 4.0;
  float mHDRBlurRadius = 7.0;

  //read writers
  osg::ref_ptr<osgDB::ReaderWriter::Options> fragmentOptions = new 
osgDB::ReaderWriter::Options("fragment");
  osg::ref_ptr<osgDB::ReaderWriter::Options> vertexOptions = new 
osgDB::ReaderWriter::Options("vertex");

  // read shaders from file
  osg::Shader* vshader = 
osgDB::readShaderFile("Data/glsl/gauss_convolution_vp.glsl", 
vertexOptions.get());
  osg::Shader* fhshader = 
osgDB::readShaderFile("Data/glsl/gauss_convolution_1Dx_fp.glsl", 
fragmentOptions.get());
  osg::Shader* fvshader = 
osgDB::readShaderFile("Data/glsl/gauss_convolution_1Dy_fp.glsl", 
fragmentOptions.get());

  // now we perform a gauss blur on the downsampled data
  osgPPU::UnitInOut* blurx = new osgPPU::UnitInOut();
  osgPPU::UnitInOut* blury = new osgPPU::UnitInOut();
  // set name and indicies
  blurx->setName("BlurHorizontal");
  blury->setName("BlurVertical");

  {
    // setup horizontal blur shaders
    osgPPU::ShaderAttribute* gaussx = new osgPPU::ShaderAttribute();
    gaussx->addShader(vshader);
    gaussx->addShader(fhshader);
    gaussx->setName("BlurHorizontalShader");

    gaussx->add("sigma", osg::Uniform::FLOAT);
    gaussx->add("radius", osg::Uniform::FLOAT);
    gaussx->add("texUnit0", osg::Uniform::SAMPLER_2D);

    gaussx->set("sigma", mHDRBlurSigma);
    gaussx->set("radius", mHDRBlurRadius);
    gaussx->set("texUnit0", 0);

    blurx->getOrCreateStateSet()->setAttributeAndModes(gaussx);

    // setup vertical blur shaders
    osgPPU::ShaderAttribute* gaussy = new osgPPU::ShaderAttribute();
    gaussy->addShader(vshader);
    gaussy->addShader(fvshader);
    gaussy->setName("BlurVerticalShader");

    gaussy->add("sigma", osg::Uniform::FLOAT);
    gaussy->add("radius", osg::Uniform::FLOAT);
    gaussy->add("texUnit0", osg::Uniform::SAMPLER_2D);

    gaussy->set("sigma", mHDRBlurSigma);
    gaussy->set("radius", mHDRBlurRadius);
    gaussy->set("texUnit0", 0);

    //blury->setShader(gaussy);
    blury->getOrCreateStateSet()->setAttributeAndModes(gaussy);
  }

  //brightpass->addChild(blurx);
  //blurx->addChild(blury);


   //--------------------------------------------------------------------------
   
//----------------------------------------------------------------------------------------
 

   osgPPU::Processor* processor = new osgPPU::Processor(); 
   processor->setName("Processor"); 

   osgPPU::UnitInOut* ppuout = new osgPPU::UnitInOut; 
   ppuout->setName("Output"); 
   ppuout->setInputTextureIndexForViewportReference(-1); 

   osg::Texture *textureOut = createRenderTexture3(image->s(), image->t(), 
false); 
   ppuout->setOutputTexture(textureOut, 0); 
   stateSet->setTextureAttributeAndModes(0, textureOut , 
osg::StateAttribute::ON); 

   osg::Camera* camera= new osg::Camera(); 
   camera->setViewport(new osg::Viewport(0,0, image->s(), image->t())); 
   processor->setCamera(camera); 

   node->addChild(processor); 
   processor->addChild(unitTexture); 

   unitTexture->addChild(blurx); 
   blurx->addChild(blury);
   blury->addChild(unitInOut);
   unitInOut->addChild(ppuout); 


   //unitTexture->addChild(unitInOut); 
   //unitInOut->addChild(unitInOut2); 
   //unitInOut2->addChild(ppuout); 

   viewer->setSceneData(node); 

   return viewer->run(); 
} 





Harash Sharma wrote:
> Hi Julia, Allen,
> 
> 
> I have one solution that most probably seems to be wht you are looking for. I 
> have been using OSG for doing some image processing. Thanks to Mr. Art Tevs' 
> osgPPU. 
> 
> Render the scene to a texture T1, High pass filter this image using a shader 
> to extract the edges (store to T2), followed by a Gaussian filtering of T2. 
> Overlay this processed image over the original with a weight factor.  
> 
> Scene ------> T1 --> [HighPass] --> T2 --> [Gaussian(LowPass)] --> T3-----|   
> | +--> T4 --> Output to Framebuffer
> |----------------------------------------------------------------|
> 
> 
> Regards
> 
> Harash
> 
> From: Allen Saucier <>
> To: 
> Sent: Tue, March 16, 2010 8:27:51 PM
> Subject: Re:  bluring model edges
> 
> Hi,
> 
> I am in need of this type of feature, too. I need to be able to take a model 
> & "fuzz" it's edges, though I must admit that I don't fully understand the 
> code given, I'll try this.
> 
> Thanks Guy for the ideas.
> 
> Cheers,
> Allen
> 
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=25726#25726
> 
> 
> 
> 
> 
> _______________________________________________
> osg-users mailing list
>  ()
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> 
>  ------------------
> Post generated by Mail2Forum
[/code]

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=26159#26159





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to