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();
}