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