Hi,

Here is the "minimal" code I use that may help somebody in the future:
It lacks some comments but it's because I'm not sure I understand everything (I 
have been helped to get that)


Code:

#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>


osg::Texture* createRenderTexture(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* createSquare(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 = createSquare();
        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("PathToImage");
        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
        }
        
//----------------------------------------------------------------------------------------

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

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

        osg::Texture *textureOut = createRenderTexture(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(unitInOut);
        unitInOut->addChild(unitInOut2);
        unitInOut2->addChild(ppuout);
        viewer->setSceneData(node);

        return viewer->run();
}




Thanks again Art!
Have a nice day everybody![/code]

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





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

Reply via email to