Attached is the minimal code that reproduce the problem

Thanks a bunch as always!

Nick

On Sun, Mar 28, 2021 at 2:49 PM Trajce Nikolov NICK <
[email protected]> wrote:

> Hi Community,
>
> I am attaching to the main camera DepthBuffer and ColorBuffer as Texture2D
> - attached is the setup. I also have shader to check the depth buffer - so
> it is ok as on the image. And I am displaying it on a quad. The depth
> buffer is still getting me zeros when the colorbuffer is attached,
> otherwise when it is not, then it works as it should.
>
> Any hints?
>
> mOsgExternalDepth = new osg::Texture2D;
> mOsgExternalDepth->setSourceFormat(GL_DEPTH_COMPONENT);
> mOsgExternalDepth->setSourceType(GL_FLOAT);
> mOsgExternalDepth->setInternalFormat(GL_DEPTH_COMPONENT32F);
> mOsgExternalDepth->setTextureWidth(screenWidth);
> mOsgExternalDepth->setTextureHeight(screenHeight);
> mOsgExternalDepth->setResizeNonPowerOfTwoHint(false);\
>
> mOsgExternalColor = new osg::Texture2D;
> mOsgExternalColor->setInternalFormat(GL_RGBA16F_ARB);
> mOsgExternalColor->setSourceFormat(GL_RGBA);
> mOsgExternalColor->setSourceType(GL_FLOAT);
> mOsgExternalColor->setTextureWidth(screenWidth);
> mOsgExternalColor->setTextureHeight(screenHeight);
> mOsgExternalColor->setResizeNonPowerOfTwoHint(false);
>
> mainCamera->attach(osg::Camera::COLOR_BUFFER,
> (osg::Texture*)mOsgExternalColor);
> mainCamera->attach(osg::Camera::DEPTH_BUFFER,
> (osg::Texture*)mOsgExternalDepth);
>
> osg::ref_ptr<osg::Camera> camera = new osg::Camera;
> camera->setProjectionMatrix(osg::Matrixd::ortho2D(0, screenWidth, 0,
> screenHeight));
> camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
> camera->setViewMatrix(osg::Matrixd::identity());
> camera->setClearMask(0);
> camera->setRenderOrder(osg::Camera::POST_RENDER);
> camera->setAllowEventFocus(false);
>
>
> context.getImageGenerator()->getViewer()->getView(0)->getSceneData()->asGroup()->addChild(camera);
>
> osg::ref_ptr<osg::Geometry> quad =
> osg::createTexturedQuadGeometry(osg::Vec3(0, 0, 0),
> osg::Vec3(screenWidth/2, 0, 0), osg::Vec3(0, screenHeight/2, 0));
> quad->getOrCreateStateSet()->setMode(GL_LIGHTING,
> osg::StateAttribute::OFF);
> quad->getOrCreateStateSet()->setTextureAttributeAndModes(0,
> mOsgExternalDepth);
>
> const std::string vertShader = ""\
> "void main() "\
> "{ "\
> " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; "\
> " gl_TexCoord[0] = gl_TextureMatrix[0] *gl_MultiTexCoord0;"\
> "}";
>
> const std::string fragShader = ""\
> "uniform sampler2D texture0; "\
> "void main() "\
> "{ "\
> " float d = texture2D( texture0, gl_TexCoord[0].xy ).x; "\
> " gl_FragColor = vec4(d, d, d, 1); "\
> "}";
>
> osg::ref_ptr<osg::Shader> vert = new osg::Shader(osg::Shader::VERTEX,
> vertShader);
> osg::ref_ptr<osg::Shader> frag = new osg::Shader(osg::Shader::FRAGMENT,
> fragShader);
>
> osg::ref_ptr<osg::Program> program = new osg::Program;
> program->addShader(vert);
> program->addShader(frag);
>
> quad->getOrCreateStateSet()->setAttributeAndModes(program);
> quad->getOrCreateStateSet()->addUniform(new
> osg::Uniform(osg::Uniform::SAMPLER_2D, "texture0", 0));
> osg::ref_ptr<osg::Geometry> quadColor =
> osg::createTexturedQuadGeometry(osg::Vec3(screenWidth / 2, 0, 0),
> osg::Vec3(screenWidth/2 , 0, 0), osg::Vec3(0, screenHeight/2, 0));
> quadColor->getOrCreateStateSet()->setMode(GL_LIGHTING,
> osg::StateAttribute::OFF);
> quadColor->getOrCreateStateSet()->setTextureAttributeAndModes(0,
> mOsgExternalColor);
>
> camera->addChild(quadColor);
> camera->addChild(quad);
>
> --
> trajce nikolov nick
>


-- 
trajce nikolov nick

-- 
You received this message because you are subscribed to the Google Groups 
"OpenSceneGraph Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osg-users/CAO-%2BzimhqOZ0Yok6hMFWtXR3MsXeVFod7fUnHTc-vXFcg3dgtA%40mail.gmail.com.
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
 *
 * This application is open source and may be redistributed and/or modified
 * freely and without restriction, both in commercial and non commercial 
applications,
 * as long as this copyright notice is maintained.
 *
 * This application is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>

#include <osg/Switch>
#include <osg/Types>
#include <osgText/Text>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>

#include <osgGA/Device>

#include <iostream>

void createScene(osgViewer::Viewer* viewer)
{
        osg::GraphicsContext::WindowingSystemInterface* wsi = 
osg::GraphicsContext::getWindowingSystemInterface();
        if (!wsi)
        {
                osg::notify(osg::NOTICE) << "Error, no WindowingSystemInterface 
available, cannot create windows." << std::endl;
                return;
        }

        unsigned int screenWidth;
        unsigned int screenHeight;

        wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), 
screenWidth, screenHeight); 


        osg::ref_ptr<osg::Texture2D> mOsgExternalDepth = new osg::Texture2D;
        mOsgExternalDepth->setSourceFormat(GL_DEPTH_COMPONENT);
        mOsgExternalDepth->setSourceType(GL_FLOAT);
        mOsgExternalDepth->setInternalFormat(GL_DEPTH_COMPONENT32F);
        mOsgExternalDepth->setTextureWidth(screenWidth);
        mOsgExternalDepth->setTextureHeight(screenHeight);
        mOsgExternalDepth->setResizeNonPowerOfTwoHint(false);

        mOsgExternalDepth->setFilter(osg::Texture2D::MIN_FILTER, 
osg::Texture2D::NEAREST);
        mOsgExternalDepth->setFilter(osg::Texture2D::MAG_FILTER, 
osg::Texture2D::NEAREST);

        mOsgExternalDepth->setWrap(osg::Texture2D::WRAP_S, 
osg::Texture2D::CLAMP_TO_EDGE);
        mOsgExternalDepth->setWrap(osg::Texture2D::WRAP_T, 
osg::Texture2D::CLAMP_TO_EDGE);

        osg::ref_ptr<osg::Camera> mainCamera = viewer->getCamera();


        osg::ref_ptr<osg::Texture2D> mOsgExternalColor = new osg::Texture2D;
        mOsgExternalColor->setInternalFormat(GL_RGBA16F_ARB);
        mOsgExternalColor->setSourceFormat(GL_RGBA);
        mOsgExternalColor->setSourceType(GL_FLOAT);
        mOsgExternalColor->setTextureWidth(screenWidth);
        mOsgExternalColor->setTextureHeight(screenHeight);
        mOsgExternalColor->setResizeNonPowerOfTwoHint(false);

        mOsgExternalColor->setFilter(osg::Texture2D::MIN_FILTER, 
osg::Texture2D::NEAREST);
        mOsgExternalColor->setFilter(osg::Texture2D::MAG_FILTER, 
osg::Texture2D::NEAREST);

        mOsgExternalColor->setWrap(osg::Texture2D::WRAP_S, 
osg::Texture2D::CLAMP_TO_EDGE);
        mOsgExternalColor->setWrap(osg::Texture2D::WRAP_T, 
osg::Texture2D::CLAMP_TO_EDGE);

        // Uncomment this to reproduce
        //mainCamera->attach(osg::Camera::COLOR_BUFFER, 
(osg::Texture*)mOsgExternalColor);
        mainCamera->attach(osg::Camera::DEPTH_BUFFER, 
(osg::Texture*)mOsgExternalDepth);

        const std::map<osg::Camera::BufferComponent, osg::Camera::Attachment> 
map = mainCamera->getBufferAttachmentMap();
        std::map<osg::Camera::BufferComponent, 
osg::Camera::Attachment>::const_iterator itr = 
map.find(osg::Camera::DEPTH_BUFFER);
        if (itr != map.end())
        {
                const osg::Camera::Attachment att = itr->second;
        }

        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
        camera->setProjectionMatrix(osg::Matrixd::ortho2D(0, screenWidth, 0, 
screenHeight));
        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera->setViewMatrix(osg::Matrixd::identity());
        camera->setClearMask(GL_DEPTH_BUFFER_BIT);
        camera->setRenderOrder(osg::Camera::POST_RENDER);
        camera->setAllowEventFocus(false);

        viewer->getSceneData()->asGroup()->addChild(camera);

        osg::ref_ptr<osg::Geometry> quad = 
osg::createTexturedQuadGeometry(osg::Vec3(0, 0, 0), osg::Vec3(screenWidth / 2, 
0, 0), osg::Vec3(0, screenHeight / 2, 0));
        quad->getOrCreateStateSet()->setMode(GL_LIGHTING, 
osg::StateAttribute::OFF);
        quad->getOrCreateStateSet()->setTextureAttributeAndModes(0, 
mOsgExternalDepth);

        const std::string vertShader = ""\
                "void main()                                                    
                                        "\
                "{                                                              
                                                        "\
                "       gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
"\
                "       gl_TexCoord[0] = gl_TextureMatrix[0] 
*gl_MultiTexCoord0;"\
                "}";

        const std::string fragShader = ""\
                "uniform sampler2D texture0;                                    
                        "\
                "void main()                                                    
                                        "\
                "{                                                              
                                                        "\
                "       float d = texture2D( texture0, gl_TexCoord[0].xy ).x;   
"\
                "       gl_FragColor = vec4(d, d, d, 1);                        
                        "\
                "}";

        osg::ref_ptr<osg::Shader> vert = new osg::Shader(osg::Shader::VERTEX, 
vertShader);
        osg::ref_ptr<osg::Shader> frag = new osg::Shader(osg::Shader::FRAGMENT, 
fragShader);

        osg::ref_ptr<osg::Program> program = new osg::Program;
        program->addShader(vert);
        program->addShader(frag);

        quad->getOrCreateStateSet()->setAttributeAndModes(program);
        quad->getOrCreateStateSet()->addUniform(new 
osg::Uniform(osg::Uniform::SAMPLER_2D, "texture0", 0));


        osg::ref_ptr<osg::Geometry> quadColor = 
osg::createTexturedQuadGeometry(osg::Vec3(screenWidth / 2, 0, 0), 
osg::Vec3(screenWidth / 2, 0, 0), osg::Vec3(0, screenHeight / 2, 0));
        quadColor->getOrCreateStateSet()->setMode(GL_LIGHTING, 
osg::StateAttribute::OFF);
        quadColor->getOrCreateStateSet()->setTextureAttributeAndModes(0, 
mOsgExternalColor);

        camera->addChild(quadColor);
        camera->addChild(quad);
}

int main(int argc, char** argv)
{
    // use an ArgumentParser object to manage the program arguments.
    osg::ArgumentParser arguments(&argc,argv);

    
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
    
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
 is the standard OpenSceneGraph example which loads and visualises 3d models.");
    
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
 [options] filename ...");
    arguments.getApplicationUsage()->addCommandLineOption("--image 
<filename>","Load an image and render it on a quad");
    arguments.getApplicationUsage()->addCommandLineOption("--dem 
<filename>","Load an image/DEM and render it on a HeightField");
    arguments.getApplicationUsage()->addCommandLineOption("--login <url> 
<username> <password>","Provide authentication information for http file 
access.");
    arguments.getApplicationUsage()->addCommandLineOption("-p <filename>","Play 
specified camera path animation file, previously saved with 'z' key.");
    arguments.getApplicationUsage()->addCommandLineOption("--speed 
<factor>","Speed factor for animation playing (1 == normal speed).");
    arguments.getApplicationUsage()->addCommandLineOption("--device 
<device-name>","add named device to the viewer");
    arguments.getApplicationUsage()->addCommandLineOption("--stats","print out 
load and compile timing stats");

    osgViewer::Viewer viewer(arguments);

    unsigned int helpType = 0;
    if ((helpType = arguments.readHelpType()))
    {
        arguments.getApplicationUsage()->write(std::cout, helpType);
        return 1;
    }

    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }

    if (arguments.argc()<=1)
    {
        
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
        return 1;
    }

    bool printStats = arguments.read("--stats");

    std::string url, username, password;
    while(arguments.read("--login",url, username, password))
    {
        
osgDB::Registry::instance()->getOrCreateAuthenticationMap()->addAuthenticationDetails(
            url,
            new osgDB::AuthenticationDetails(username, password)
        );
    }

    std::string device;
    while(arguments.read("--device", device))
    {
        osg::ref_ptr<osgGA::Device> dev = 
osgDB::readRefFile<osgGA::Device>(device);
        if (dev.valid())
        {
            viewer.addDevice(dev);
        }
    }

    // set up the camera manipulators.
    {
        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = 
new osgGA::KeySwitchMatrixManipulator;

        keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new 
osgGA::TrackballManipulator() );
        keyswitchManipulator->addMatrixManipulator( '2', "Flight", new 
osgGA::FlightManipulator() );
        keyswitchManipulator->addMatrixManipulator( '3', "Drive", new 
osgGA::DriveManipulator() );
        keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new 
osgGA::TerrainManipulator() );
        keyswitchManipulator->addMatrixManipulator( '5', "Orbit", new 
osgGA::OrbitManipulator() );
        keyswitchManipulator->addMatrixManipulator( '6', "FirstPerson", new 
osgGA::FirstPersonManipulator() );
        keyswitchManipulator->addMatrixManipulator( '7', "Spherical", new 
osgGA::SphericalManipulator() );

        std::string pathfile;
        double animationSpeed = 1.0;
        while(arguments.read("--speed",animationSpeed) ) {}
        char keyForAnimationPath = '8';
        while (arguments.read("-p",pathfile))
        {
            osgGA::AnimationPathManipulator* apm = new 
osgGA::AnimationPathManipulator(pathfile);
            if (apm && !apm->getAnimationPath()->empty())
            {
                apm->setTimeScale(animationSpeed);

                unsigned int num = 
keyswitchManipulator->getNumMatrixManipulators();
                keyswitchManipulator->addMatrixManipulator( 
keyForAnimationPath, "Path", apm );
                keyswitchManipulator->selectMatrixManipulator(num);
                ++keyForAnimationPath;
            }
        }

        viewer.setCameraManipulator( keyswitchManipulator.get() );
    }

    // add the state manipulator
    viewer.addEventHandler( new 
osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );

    // add the thread model handler
    viewer.addEventHandler(new osgViewer::ThreadingHandler);

    // add the window size toggle handler
    viewer.addEventHandler(new osgViewer::WindowSizeHandler);

    // add the stats handler
    viewer.addEventHandler(new osgViewer::StatsHandler);

    // add the help handler
    viewer.addEventHandler(new 
osgViewer::HelpHandler(arguments.getApplicationUsage()));

    // add the record camera path handler
    viewer.addEventHandler(new osgViewer::RecordCameraPathHandler);

    // add the LOD Scale handler
    viewer.addEventHandler(new osgViewer::LODScaleHandler);

    // add the screen capture handler
    viewer.addEventHandler(new osgViewer::ScreenCaptureHandler);

    osg::ElapsedTime elapsedTime;

    // load the data
    osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFiles(arguments);
    if (!loadedModel)
    {
        std::cout << arguments.getApplicationName() <<": No data loaded" << 
std::endl;
        return 1;
    }

    if (printStats)
    {
        double loadTime = elapsedTime.elapsedTime_m();
        std::cout<<"Load time "<<loadTime<<"ms"<<std::endl;

        viewer.getStats()->collectStats("compile", true);
    }


    // any option left unread are converted into errors to write out later.
    arguments.reportRemainingOptionsAsUnrecognized();

    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }


    // optimize the scene graph, remove redundant nodes and state etc.
    osgUtil::Optimizer optimizer;
    optimizer.optimize(loadedModel);

        osg::ref_ptr<osg::Group> root = new osg::Group;

        root->addChild(loadedModel);

        

    viewer.setSceneData(root);

        createScene(&viewer);

    viewer.realize();

    return viewer.run();

}

Reply via email to