Re: [osg-users] Problems with MRT

2018-05-15 Thread Rômulo Cerqueira
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 
#include 
#include 
#include 
#include 
#include 
#include 

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 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 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 _texColor;
osg::ref_ptr _texDepth;
};

osg::Camera* setupMRTCamera( osg::ref_ptr camera, 
std::vector& 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 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 

Re: [osg-users] conversion from .vert/.frag files to cpp inline

2018-05-15 Thread Christoph Dohmen
Hi Robert,

that's it, I tried several osg examples but missed the osg2cpp one :-(

Thank you!

Cheers,
Christoph

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





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


[osg-users] conversion from .vert/.frag files to cpp inline

2018-05-15 Thread Christoph Dohmen
Hi all,

is there any easy 'conversion utility' to create cpp inlined definition of 
shader sources from .vert / .frag files?

Thanks!

Cheers,
Christoph

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





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org