Hi Romulo,
Have you debugged into the writeImage functionality of the png-plugin?
Have you tried using tiff etc.?
I suspect that either the read-back image is either empty or has the
wrong image format, so the plugin cannot write it. Not all formats that
you can use for images can be written by the plugins.
Cheers
Sebastian
Hi,
just updating my progress:
What have I got so far?
[ ✓ ] Allow rendering for color or depth buffers on the same camera;
[ ✓ ] Display only the color buffer in the post render camera;
[ ✓ ] Read color or depth buffer in the final draw callback;
[ ✗ ] Write collected image (color or depth) in disk - only images as
GL_UNSIGNED_BYTE, instead of GL_FLOAT.
I changed the buffer reader in my callback (readImageFromCurrentTexture()
instead of readPixels()), however I still got problems when I render floating
textures...
This is my current code:
Code:
// OSG includes
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osg/Camera>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Texture2D>
struct SnapImage : public osg::Camera::DrawCallback {
SnapImage(osg::GraphicsContext* gc, osg::Texture2D* tex1, osg::Texture2D*
tex2 ) {
if (gc->getTraits()) {
_texColor = tex1;
_texDepth = tex2;
}
}
virtual void operator () (osg::RenderInfo& renderInfo) const {
// color buffer
renderInfo.getState()->applyTextureAttribute(0, _texColor);
osg::ref_ptr<osg::Image> mColor = new osg::Image();
mColor->readImageFromCurrentTexture(renderInfo.getContextID(), true,
GL_UNSIGNED_BYTE);
osgDB::ReaderWriter::WriteResult wrColor =
osgDB::Registry::instance()->writeImage(*mColor, "./Test-color.png", NULL);
if (!wrColor.success()) {
osg::notify(osg::WARN) << "Color image: failed! (" << wrColor.message() <<
")" << std::endl;
}
// depth buffer
renderInfo.getState()->applyTextureAttribute(0, _texDepth);
osg::ref_ptr<osg::Image> mDepth = new osg::Image();
mDepth->readImageFromCurrentTexture(renderInfo.getContextID(), true,
GL_UNSIGNED_BYTE);
osgDB::ReaderWriter::WriteResult wrDepth =
osgDB::Registry::instance()->writeImage(*mDepth, "./Test-depth.png", NULL);
if (!wrDepth.success()) {
osg::notify(osg::WARN) << "Depth image: failed! (" << wrDepth.message() <<
")" << std::endl;
}
}
osg::ref_ptr<osg::Texture2D> _texColor;
osg::ref_ptr<osg::Texture2D> _texDepth;
};
osg::Camera* setupMRTCamera( osg::ref_ptr<osg::Camera> camera,
std::vector<osg::Texture2D*>& attachedTextures, int w, int h ) {
camera->setClearColor( osg::Vec4() );
camera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
camera->setRenderOrder( osg::Camera::PRE_RENDER, 0 );
camera->setViewport( 0, 0, w, h );
osg::Texture2D* tex = new osg::Texture2D;
tex->setTextureSize( w, h );
tex->setInternalFormat( GL_RGB );
tex->setSourceFormat( GL_RGBA );
tex->setSourceType( GL_UNSIGNED_BYTE );
tex->setResizeNonPowerOfTwoHint( false );
tex->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR );
tex->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
attachedTextures.push_back( tex );
camera->attach( osg::Camera::COLOR_BUFFER, tex );
tex = new osg::Texture2D;
tex->setTextureSize(w,h);
tex->setSourceFormat(GL_DEPTH_COMPONENT);
tex->setInternalFormat(GL_DEPTH_COMPONENT);
tex->setSourceType(GL_UNSIGNED_BYTE);
attachedTextures.push_back( tex );
camera->attach( osg::Camera::DEPTH_BUFFER, tex );
return camera.release();
}
int main() {
osg::ref_ptr< osg::Group > root( new osg::Group );
root->addChild( osgDB::readNodeFile(
"/home/romulo/Tools/OpenSceneGraph-Data/cow.osg" ) );
unsigned int winW = 800;
unsigned int winH = 600;
osgViewer::Viewer viewer;
viewer.setUpViewInWindow( 0, 0, winW, winH );
viewer.setSceneData( root.get() );
viewer.realize();
// setup MRT camera
std::vector<osg::Texture2D*> attachedTextures;
osg::Camera* mrtCamera ( viewer.getCamera() );
setupMRTCamera( mrtCamera, attachedTextures, winW, winH );
// set RTT textures to quad
osg::Geode* geode( new osg::Geode );
geode->addDrawable( osg::createTexturedQuadGeometry(
osg::Vec3(-1,-1,0), osg::Vec3(2.0,0.0,0.0), osg::Vec3(0.0,2.0,0.0)) );
geode->getOrCreateStateSet()->setTextureAttributeAndModes( 0,
attachedTextures[0] );
geode->getOrCreateStateSet()->setMode( GL_LIGHTING,
osg::StateAttribute::OFF );
geode->getOrCreateStateSet()->setMode( GL_DEPTH_TEST,
osg::StateAttribute::OFF );
// configure postRenderCamera to draw fullscreen textured quad
osg::Camera* postRenderCamera( new osg::Camera );
postRenderCamera->setClearMask( 0 );
postRenderCamera->setRenderTargetImplementation(
osg::Camera::FRAME_BUFFER, osg::Camera::FRAME_BUFFER );
postRenderCamera->setReferenceFrame( osg::Camera::ABSOLUTE_RF );
postRenderCamera->setRenderOrder( osg::Camera::POST_RENDER );
// postRenderCamera->setViewMatrix( osg::Matrixd::identity() );
// postRenderCamera->setProjectionMatrix( osg::Matrixd::identity() );
postRenderCamera->addChild( geode );
root->addChild(postRenderCamera);
// setup the callback
SnapImage* finalDrawCallback = new
SnapImage(viewer.getCamera()->getGraphicsContext(), attachedTextures[0],
attachedTextures[1]);
mrtCamera->setFinalDrawCallback(finalDrawCallback);
return (viewer.run());
}
...
Thank you!
Cheers,
Rômulo[/code][/i]
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=73644#73644
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org