Alright, I thought that might be the answer.. As for FBO vs PBuffer, I'm running right now on a LAte 2011 MAcbook Pro, with the ATI chipset.. I thought FBO's were supported but maybe not...
Sergey Polischuk wrote: > > followup: > just use rgba texture for your case. > > multiple render targets work only if you render stuff with shaders and > in fragment shader output values separately for each render target > with gl_FragData[attachment_index] = value; (instead of gl_FragColor > or whatever). As i've said, all render targets should have same size, > format, and channels count for this setup, or you will get fbo setup > errors. > > Cheers. > > 14.09.2012, 11:26, "Sergey Polischuk" <pol...@yandex.ru>: >> >> Hi Randall >> >> All color attachments must have same size, format, and channels count. >> >> Cheers. >> >> 14.09.2012, 08:29, "Randall Hand" <randall.h...@gmail.com>: >> >>> >>> I'm trying to write a simple app to render a scene and drop out 3 >>> buffers : Depth, Color (RGB), and Alpha. I've pasted the code below, >>> and there's an important DEFINE at the top: SHOW_ALPHA. If you set >>> SHOW_ALPHA to 0, that disables the COLOR_BUFFER1 (a GL_ALPHA texture >>> attachment to the main camera) and everything works perfectly. I set >>> that to 1, and then my visuals get all scrambled and I get the following >>> error messages: >>> >>> RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cdd >>> Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support >>> multiple color outputs. >>> Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support >>> multiple color outputs. >>> RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cdd >>> Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support >>> multiple color outputs. >>> Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support >>> multiple color outputs. >>> >>> Now, I think I can accomplish what I want using a single RGBA texture >>> and a fragment shader to pull out the A. Am I doing something wrong, or >>> is the fragment-shader route the "right" way to go? >>> >>> Code below: >>> >>> #include <osgViewer/Viewer> >>> >>> #include <osg/BlendFunc> >>> #include <osg/Geode> >>> #include <osg/TexGen> >>> #include <osg/Texture2D> >>> #include <osg/MatrixTransform> >>> #include <osg/LightModel> >>> #include <osg/Material> >>> #include <osgGA/NodeTrackerManipulator> >>> #include <osgDB/ReadFile> >>> #include <osgViewer/Viewer> >>> >>> #define SHOW_ALPHA 0 >>> #define SHOW_DEPTH 1 >>> #define HEIGHT_OFFSET 24 >>> >>> int main(void) { >>> >>> int width=512, height=256; >>> osg::ref_ptr<osg::Geode> screenQuad = new osg::Geode; >>> >>> osg::ref_ptr<osg::Texture2D> __depthTexture = new osg::Texture2D(); >>> osg::ref_ptr<osg::Texture2D> __maskTexture = new osg::Texture2D(); >>> osg::ref_ptr<osg::Texture2D> __colorTexture = new osg::Texture2D(); >>> osg::ref_ptr<osg::Node> model = >>> osgDB::readNodeFile("/Users/rhand/Documents/MagicLeap/data/MLOS-Logo.obj"); >>> osgViewer::Viewer V; >>> osg::ref_ptr<osg::Group> group = new osg::Group(); >>> >>> >>> //model->getOrCreateStateSet()->setMode(GL_,osg::StateAttribute::OFF); >>> >>> model->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON); >>> >>> model->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON); >>> >>> V.getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT | >>> GL_COLOR_BUFFER_BIT); >>> V.getCamera()->setClearDepth(1.0); >>> V.getCamera()->setClearColor(osg::Vec4(0,0,0,0)); >>> group->addChild(model.get()); >>> V.setSceneData(group.get()); >>> >>> // Establish the "base" Graphics Context >>> osg::ref_ptr<osg::GraphicsContext::Traits> traits = new >>> osg::GraphicsContext::Traits; >>> traits->x = 0; >>> traits->y = HEIGHT_OFFSET; >>> traits->width = width; >>> traits->height = height; >>> traits->windowDecoration = true; >>> traits->doubleBuffer = true; >>> traits->sharedContext = 0; // Doesn't inherit from anything >>> traits->vsync = true; // Disable VSync (for now) >>> traits->supportsResize = false; >>> traits->windowName = "Color"; >>> osg::ref_ptr<osg::GraphicsContext> gc = >>> osg::GraphicsContext::createGraphicsContext(traits.get()); >>> >>> { >>> __depthTexture->setTextureSize(width,height); >>> __depthTexture->setInternalFormat(GL_DEPTH_COMPONENT); >>> >>> __depthTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::NEAREST); >>> >>> __depthTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::NEAREST); >>> >>> __depthTexture->setDataVariance( osg::Object::DYNAMIC ); >>> __depthTexture->setResizeNonPowerOfTwoHint( false ); >>> >>> __maskTexture->setTextureSize(width,height); >>> __maskTexture->setInternalFormat(GL_ALPHA); >>> >>> __maskTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::NEAREST); >>> >>> __maskTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::NEAREST); >>> >>> __maskTexture->setDataVariance( osg::Object::DYNAMIC ); >>> __maskTexture->setResizeNonPowerOfTwoHint( false ); >>> >>> __colorTexture->setTextureSize(width,height); >>> __colorTexture->setInternalFormat(GL_RGB); >>> >>> __colorTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::NEAREST); >>> >>> __colorTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::NEAREST); >>> >>> __colorTexture->setDataVariance( osg::Object::DYNAMIC ); >>> __colorTexture->setResizeNonPowerOfTwoHint( false ); >>> >>> osg::ref_ptr<osg::Camera> __camera = new osg::Camera(); >>> __camera->setGraphicsContext(gc.get()); >>> __camera->setClearMask(GL_COLOR_BUFFER_BIT | >>> GL_DEPTH_BUFFER_BIT); >>> __camera->setViewport(new osg::Viewport(0,0, traits->width, >>> traits->height)); >>> >>> __camera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR); >>> __camera->setProjectionMatrixAsPerspective(70,(height/width), >>> 1,200); >>> __camera->setClearDepth(1.0); >>> __camera->setViewMatrixAsLookAt( osg::Vec3(0,0,0), >>> osg::Vec3(0,100,0), osg::Vec3(0,0,1) ); >>> __camera->setRenderOrder(osg::Camera::PRE_RENDER); >>> >>> __camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); >>> __camera->attach(osg::Camera::COLOR_BUFFER0, __colorTexture); >>> #if SHOW_DEPTH >>> __camera->attach(osg::Camera::DEPTH_BUFFER, __depthTexture); >>> #endif >>> #if SHOW_ALPHA >>> __camera->attach(osg::Camera::COLOR_BUFFER1, __maskTexture); >>> #endif >>> V.addSlave(__camera.get(), osg::Matrixd(), osg::Matrixd()); >>> } >>> { // Make the re-usable Quad for displaying the textures >>> // Make the quad with a little 10px border around the >>> edges, for >>> debugging >>> >>> osg::ref_ptr<osg::Drawable> quad = >>> osg::createTexturedQuadGeometry( >>> osg::Vec3(10,10.0,0), >>> osg::Vec3(width-20,0,0),osg::Vec3(0,height-20,0), >>> 0, 0, 1, 1); >>> quad->setDataVariance( osg::Object::STATIC ); // This is >>> _always_ a screen-aligned quad >>> quad->setUseDisplayList( true ); >>> osg::StateSet* ss = quad->getOrCreateStateSet(); >>> ss->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON); >>> ss->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); >>> ss->setMode(GL_LIGHTING,osg::StateAttribute::OFF); >>> ss->setMode(GL_BLEND, osg::StateAttribute::ON); >>> ss->setAttribute(new osg::BlendFunc(GL_SRC_ALPHA, >>> GL_ONE_MINUS_SRC_ALPHA), osg::StateAttribute::ON); >>> // Put the quad in a Geometry Node (Geode) and configure it for >>> Texture coordinates >>> //osg::ref_ptr<osg::Geode> *geode = new osg::Geode; >>> screenQuad->addDrawable( quad.get() ); >>> } >>> >>> #if SHOW_DEPTH >>> { // Display the Depth MAsk >>> osg::ref_ptr<osg::GraphicsContext::Traits> traits = new >>> osg::GraphicsContext::Traits; >>> traits->x = 0; >>> traits->y = height + (HEIGHT_OFFSET*3); >>> traits->width = width; >>> traits->height = height; >>> traits->windowDecoration = true; >>> traits->doubleBuffer = true; >>> traits->sharedContext = gc.get(); >>> traits->vsync = true; // Disable VSync (for now) >>> traits->supportsResize = false; >>> traits->windowName = "Depth"; >>> osg::ref_ptr<osg::GraphicsContext> this_gc = >>> osg::GraphicsContext::createGraphicsContext(traits.get()); >>> >>> // now create a camera >>> // It's an orthographic 2D camera (sized to pixel match) >>> // Load an identity view matrix, and set the only geometry >>> here >>> to be the quad >>> osg::ref_ptr<osg::Camera> __camera = new osg::Camera(); >>> __camera->setGraphicsContext(this_gc.get()); >>> __camera->setViewport(new osg::Viewport(0,0, width, height)); >>> __camera->setClearMask(GL_COLOR_BUFFER_BIT); >>> __camera->setClearDepth(1.0); >>> __camera->setClearColor(osg::Vec4(1,0,0,0)); // Red border >>> __camera->setRenderOrder(osg::Camera::POST_RENDER); >>> >>> __camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width,0,height)); >>> __camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); >>> __camera->setViewMatrix(osg::Matrix::identity()); >>> __camera->addChild(screenQuad.get()); >>> osg::StateSet *ss = __camera->getOrCreateStateSet(); >>> ss->setTextureAttributeAndModes(0, __depthTexture, >>> osg::StateAttribute::ON); >>> >>> V.addSlave(__camera.get(), osg::Matrixd(), osg::Matrixd(), >>> false); >>> } >>> #endif >>> #if SHOW_ALPHA >>> { // display the Alpha mask >>> osg::ref_ptr<osg::GraphicsContext::Traits> traits = new >>> osg::GraphicsContext::Traits; >>> traits->x = 0; >>> traits->y = 2*height+ 4*HEIGHT_OFFSET; >>> traits->width = width; >>> traits->height = height; >>> traits->windowDecoration = true; >>> traits->doubleBuffer = true; >>> traits->sharedContext = gc.get(); >>> traits->vsync = true; // Disable VSync (for now) >>> traits->supportsResize = false; >>> traits->windowName = "alpha"; >>> osg::ref_ptr<osg::GraphicsContext> this_gc = >>> osg::GraphicsContext::createGraphicsContext(traits.get()); >>> >>> // now create a camera >>> // It's an orthographic 2D camera (sized to pixel match) >>> // Load an identity view matrix, and set the only geometry >>> here >>> to be the quad >>> osg::ref_ptr<osg::Camera> __camera = new osg::Camera(); >>> __camera->setGraphicsContext(this_gc.get()); >>> __camera->setViewport(new osg::Viewport(0,0, width, height)); >>> __camera->setClearMask(GL_COLOR_BUFFER_BIT); >>> __camera->setClearDepth(1.0); >>> __camera->setClearColor(osg::Vec4(0,0,0,0)); >>> __camera->setRenderOrder(osg::Camera::POST_RENDER); >>> >>> __camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width,0,height)); >>> __camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); >>> __camera->setViewMatrix(osg::Matrix::identity()); >>> __camera->addChild(screenQuad.get()); >>> osg::StateSet *ss = __camera->getOrCreateStateSet(); >>> ss->setTextureAttributeAndModes(0, __maskTexture, >>> osg::StateAttribute::ON); >>> >>> V.addSlave(__camera.get(), osg::Matrixd(), osg::Matrixd(), >>> false); >>> } >>> #endif >>> { // display the Color mask >>> // now create a camera >>> // It's an orthographic 2D camera (sized to pixel match) >>> // Load an identity view matrix, and set the only geometry >>> here >>> to be the quad >>> osg::ref_ptr<osg::Camera> __camera = new osg::Camera(); >>> __camera->setGraphicsContext(gc.get()); >>> __camera->setViewport(new osg::Viewport(0,0, width, height)); >>> __camera->setClearMask(GL_COLOR_BUFFER_BIT); >>> __camera->setClearDepth(1.0); >>> __camera->setClearColor(osg::Vec4(0,0,0,0)); >>> __camera->setRenderOrder(osg::Camera::POST_RENDER); >>> >>> __camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width,0,height)); >>> __camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); >>> __camera->setViewMatrix(osg::Matrix::identity()); >>> __camera->addChild(screenQuad.get()); >>> osg::StateSet *ss = __camera->getOrCreateStateSet(); >>> ss->setTextureAttributeAndModes(0, __colorTexture, >>> osg::StateAttribute::ON); >>> >>> V.addSlave(__camera.get(), osg::Matrixd(), osg::Matrixd(), >>> false); >>> } >>> >>> V.run(); >>> } >>> >>> -- >>> Randall Hand >>> http://www.yeraze.com >>> >>> _______________________________________________ >>> osg-users mailing list >>> osg-users@lists.openscenegraph.org >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> _______________________________________________ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org