Hi,
when using multiple camera configured with multisample, i get black screen 
without any warning, without multisample it works fine.
In my test code, two rtt camera render different node to same depth buffer and 
color buffer, it works fine if configure only first camera with multisample, 
configure both camera with multisample will cause black screen. 

the test code is as follow, the shader is simple texfetch.


Code:
#include <osg/MatrixTransform>
#include <osg/Program>
#include <osg/StateSet>
#include <osg/Node>
#include <osgDB/readFile>
#include <osgViewer/Viewer>


/*
*       multisample.
*/
osg::Program* createProgram(std::string vertSource, std::string fragSource)
{
        osg::ref_ptr<osg::Shader> vert = 
osgDB::readShaderFile(osg::Shader::VERTEX, vertSource);
    osg::ref_ptr<osg::Shader> frag = 
osgDB::readShaderFile(osg::Shader::FRAGMENT, fragSource);

    osg::ref_ptr<osg::Program> prog = new osg::Program;
    if (!prog->addShader(vert.get()))
        std::cout<<"add vertex shader failed!\n";
    if (!prog->addShader(frag.get()))
        std::cout<<"add fragment shader failed!\n";

        return prog.release();
}

int main(void)
{
        osg::ref_ptr<osg::Group> scene = new osg::Group;

        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("../media/cow.ive");
        {
                osg::ref_ptr<osg::Program> prog = createProgram("base.vert", 
"base.frag");

                osg::ref_ptr<osg::StateSet> set = node->getOrCreateStateSet();

                set->setAttributeAndModes(prog, osg::StateAttribute::ON);
                
                osg::ref_ptr<osg::Uniform> texUniform = new 
osg::Uniform("renderTex", 0);
                set->addUniform(texUniform.get());

        }

        osg::ref_ptr<osg::Texture2D> baseTex = new osg::Texture2D;
        {               
                baseTex->setTextureSize(800, 600);
                baseTex->setInternalFormat(GL_RGBA);//important.
        }
        osg::ref_ptr<osg::Texture2D> depthTex = new osg::Texture2D;
        {               
                depthTex->setTextureSize(800, 600);
                depthTex->setSourceFormat(GL_DEPTH_COMPONENT);
                depthTex->setSourceType(GL_UNSIGNED_BYTE);
                depthTex->setInternalFormat(GL_DEPTH_COMPONENT24);
        }
        {// first RTT camera
                osg::ref_ptr<osg::Camera> camera = new osg::Camera;
                camera->addChild(node.get());
                scene->addChild(camera.get());

                camera->setClearColor(osg::Vec4f(0.0f, 0.0f, 1.0f, 1.0f));
                camera->setClearDepth(1.0);
                camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
                camera->setRenderOrder(osg::Camera::PRE_RENDER);
                camera->attach(osg::Camera::COLOR_BUFFER0, baseTex.get(), 0, 0, 
false, 4, 0);
                camera->attach(osg::Camera::DEPTH_BUFFER, depthTex.get(), 0, 0, 
false, 4, 0);
                camera->setViewport(0, 0, baseTex->getTextureWidth(), 
baseTex->getTextureHeight());
                camera->setReferenceFrame(osg::Transform::RELATIVE_RF);

                
camera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
                camera->setCullingMode(osg::CullSettings::NO_CULLING);
        }
        {// second RTT camera
                osg::ref_ptr<osg::Camera> camera = new osg::Camera;
                osg::Matrixf translate;
                translate.makeTranslate(osg::Vec3f(0.0f, 0.0f, 10.0f));
                osg::ref_ptr<osg::MatrixTransform> matrixTransform = new 
osg::MatrixTransform;
                matrixTransform->setMatrix(translate);
                matrixTransform->addChild(node.get());
                camera->addChild(matrixTransform.get());
                scene->addChild(camera.get());

//              camera->setClearColor(osg::Vec4f(0.0f, 0.0f, 1.0f, 1.0f));
//              camera->setClearDepth(1.0);
                camera->setClearMask(0);
                
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
                camera->setRenderOrder(osg::Camera::PRE_RENDER);
                camera->attach(osg::Camera::COLOR_BUFFER0, baseTex.get(), 0, 0, 
false, 0, 0);
                camera->attach(osg::Camera::DEPTH_BUFFER, depthTex.get(), 0, 0, 
false, 0, 0);
                camera->setViewport(0, 0, baseTex->getTextureWidth(), 
baseTex->getTextureHeight());
                camera->setReferenceFrame(osg::Transform::RELATIVE_RF);

                
camera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
                camera->setCullingMode(osg::CullSettings::NO_CULLING);
        }
        {
                osg::ref_ptr<osg::Node> screenQuad = 
drawScreenQuad(baseTex.get());
                scene->addChild(screenQuad.get());

                osg::ref_ptr<osg::Program> prog = 
createProgram("screenQuad.vert", "screenQuad.frag");

                osg::ref_ptr<osg::StateSet> set = 
screenQuad->getOrCreateStateSet();

                set->setAttributeAndModes(prog, osg::StateAttribute::ON);

                osg::ref_ptr<osg::Uniform> baseTexUniform = new 
osg::Uniform("renderTex", 0);
                set->addUniform(baseTexUniform.get());
        }
        
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        viewer->setSceneData(scene.get());

        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
        traits->x = 200;
        traits->y = 200;
        traits->width = 800;
        traits->height = 600;
        traits->windowDecoration = true;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;

        osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());
        const osgViewer::GraphicsWindow* const gw = 
dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
        if (!gw)
        {
                osg::notify(osg::NOTICE)<<"Error: unable to create graphics 
window."<<std::endl;
                return 1;
        }
        gc->getState()->setUseModelViewAndProjectionUniforms(true);
        viewer->getCamera()->setGraphicsContext(gc.get());
        viewer->getCamera()->setViewport(0,0,traits->width,traits->height);
        
viewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
        viewer->getCamera()->setCullingMode(osg::CullSettings::NO_CULLING);
        return viewer->run();
}



basic.vert

Code:
#version 400

layout(location = 0)in vec4 osg_Vertex;
layout(location = 8)in vec4 osg_MultiTexCoord0;

uniform mat4 osg_ModelViewProjectionMatrix;

out vec2 TexCoord;

void main()
{
        gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex;
        TexCoord = osg_MultiTexCoord0.xy;
}



basic.frag

Code:
#version 400

in vec2 TexCoord;
uniform sampler2D renderTex;

layout( location = 0 ) out vec4 FragColor;

void main() 
{
    FragColor = texture(renderTex, TexCoord);
}



screenQuad.vert

Code:
#version 400

layout(location = 0)in vec4 osg_Vertex;
layout(location = 8)in vec4 osg_MultiTexCoord0;

out vec2 TexCoord;

void main()
{
        gl_Position =osg_Vertex;
        TexCoord = osg_MultiTexCoord0.xy;
}



screenQuad.frag

Code:
#version 400

uniform sampler2D renderTex;

in vec2 TexCoord;

layout( location = 0 ) out vec4 FragColor;

void main() 
{
    FragColor = texture(renderTex, TexCoord);
}



Is there anything wrong?
Thank you!

Cheers,
fengyun[/code]

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





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to