Hello
> it possible that either your hardware or (more likely) your drivers
do not support framebuffer objects ?
nope GL_EXTENSION_STRING: GL_EXT_framebuffer_object
I also tryed it on an other PC with gf8
> What happens if you replace the fbo_vp->setFboOn(true) line with
> fbo_vp->setFboOn(false) ? (This fakes the FBO behavior by rendering
to the framebuffer and copying the
> data around).
ok the demo 29 render nothnig ... the winows stays empty
the other code from you render but the PNG is empty
> You can also take a look at OpenSG/Tutorials/29FBOTexture.cpp (the
attached version has basically your
> changes from above included) which is a simpler example using the
FBOViewport and see if that gives you
> better results.
nope empty PNG,
for info I ave OpenSG 1.8.0? is This a problem?
eik
Carsten Neumann schrieb:
> Hello Eik,
>
> Eik Deistung wrote:
>> Hello
>>
>> i do not get it working ....
>> for testing I tryed just to write a Image to file.
>>
>> ok a least a used your Version from the mail to Abdalla from 15.02.
>> (code atached)
>>
>> I added in
>> main(int argc, char **argv)
>> -> fbo_vp->setReadBuffer(true); // added
>>
>> and in
>>
>> void keyboard(unsigned char k, int x, int y)
>>
>> case 'a':
>> {
>> fbo_vp-> getTextures(0)->getImage()->write("test1.png");
>> break;
>> }
>>
>> but only get black images.
>
> is it possible that either your hardware or (more likely) your drivers
> do not support framebuffer objects ?
> What happens if you replace the fbo_vp->setFboOn(true) line with
> fbo_vp->setFboOn(false) ? (This fakes the FBO behavior by rendering to
> the framebuffer and copying the data around).
>
> You can also take a look at OpenSG/Tutorials/29FBOTexture.cpp (the
> attached version has basically your changes from above included) which
> is a simpler example using the FBOViewport and see if that gives you
> better results.
>
> Hope it helps,
> Carsten
> ------------------------------------------------------------------------
>
> // OpenSG FBO example: 29FBOTexture.cpp
> //
> // Shows how to use the FBOViewport for render-to-texture
> //
>
> #include <OpenSG/OSGGLUT.h>
> #include <OpenSG/OSGConfig.h>
> #include <OpenSG/OSGSimpleSceneManager.h>
> #include <OpenSG/OSGGLUTWindow.h>
> #include <OpenSG/OSGGradientBackground.h>
> #include <OpenSG/OSGSceneFileHandler.h>
> #include <OpenSG/OSGSimpleGeometry.h>
> #include <OpenSG/OSGImage.h>
> #include <OpenSG/OSGTextureChunk.h>
> #include <OpenSG/OSGFBOViewport.h>
> #include <OpenSG/OSGSimpleTexturedMaterial.h>
> #include <OpenSG/OSGMatrixUtility.h>
> #include <OpenSG/OSGPointLight.h>
> #include <OpenSG/OSGQuaternion.h>
> #include <OpenSG/OSGGeoFunctions.h>
> #include <OpenSG/OSGImageFunctions.h>
> #include <OpenSG/OSGTwoSidedLightingChunk.h>
> #include <OpenSG/OSGComponentTransform.h>
> #include <OpenSG/OSGImageFileType.h>
> #include <OpenSG/OSGTextureTransformChunk.h>
>
> OSG_USING_NAMESPACE
>
> // globals
> SimpleSceneManager *mgr (NULL);
> FBOViewportPtr fboVP (NullFC);
> TransformPtr fboSceneTrans(NullFC);
> NodePtr fboCamBeacon (NullFC);
> GeometryPtr flagGeo (NullFC);
>
> // flag parameters
> const float flagHeight = 8.0f;
> const float flagWidth = 16.0f;
> const int flagGeoHor = (int)flagWidth * 3;
> const int flagGeoVert = (int)flagHeight / 2;
> const float flagWaveDamp = 0.06f;
>
> const float poleHeight = 24.0f;
> const float poleDia = poleHeight * 0.01f;
>
> // fbo size
> const int fboWidth = (int)flagWidth * 32;
> const int fboHeight = (int)flagHeight * 32;
>
> // forward declarations
> Matrix showAll(NodePtr root, PerspectiveCameraPtr cam);
>
> void animateFlag (Real64 t);
> void spinFBOScene(Real64 t);
>
> SimpleTexturedMaterialPtr createWoodMaterial();
> NodePtr buildFlag(TextureChunkPtr fboTexture, const int &flagHor, const int
> &flagVert);
> NodePtr buildFBOScene(int argc, char **argv );
> void setupFBO(TextureChunkPtr fboTexture, GLUTWindowPtr gwin, NodePtr
> fboScene );
>
> // redraw the window
> void display(void)
> {
> static Real64 t0 = OSG::getSystemTime();
>
> // get the current time
> Real64 t = OSG::getSystemTime() - t0;
>
> // animate flag
> animateFlag(t);
>
> // spin the fbo scene
> spinFBOScene(t);
>
> // get the RenderAction from SimpleSceneManager
> RenderAction *rAct = static_cast<RenderAction*>(::mgr->getAction());
>
> // render fbo scene
> ::fboVP->render(rAct);
>
> // render main scene
> ::mgr->redraw();
> }
>
> // react to size changes
> void reshape(int w, int h)
> {
> ::mgr->resize(w,h);
> glutPostRedisplay();
> }
>
> // react to mouse button presses
> void mouse(int button, int state, int x, int y)
> {
> if (state)
> ::mgr->mouseButtonRelease(button, x, y);
> else
> ::mgr->mouseButtonPress(button, x, y);
>
> glutPostRedisplay();
> }
>
> // react to mouse motions with pressed buttons
> void motion(int x, int y)
> {
> ::mgr->mouseMove(x, y);
> glutPostRedisplay();
> }
>
> // react to keys
> void keyboard(unsigned char k, int, int)
> {
> switch(k)
> {
> case 27: exit(1);
> case 'a': ::fboVP->getTextures(0)->getImage()->write("test1.png");
> break;
> default: break;
> }
> }
>
>
> int main(int argc, char **argv)
> {
> // OpenSG init
> osgInit(argc,argv);
>
> // GLUT init
> glutInit(&argc, argv);
> glutInitWindowSize(800,600);
> glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
>
> int winid = glutCreateWindow("OpenSG " OSG_VERSION_STRING " FBO example");
>
> // register GLUT callbacks
> glutReshapeFunc(reshape);
> glutDisplayFunc(display);
> glutIdleFunc(display);
> glutMouseFunc(mouse);
> glutMotionFunc(motion);
> glutKeyboardFunc(keyboard);
>
>
> // create a GLUTWindow
> GLUTWindowPtr gwin = GLUTWindow::create();
> beginEditCP(gwin);
> gwin->setId(winid);
> gwin->init();
> endEditCP(gwin);
>
> // create the SimpleSceneManager helper
> ::mgr = new SimpleSceneManager;
>
> // create the texture that is used as render target by the sub-scene
> // and as texture in the main scene
> TextureChunkPtr fboTexture = TextureChunk::create();
> beginEditCP(fboTexture);
> fboTexture->setEnvMode(GL_MODULATE);
> endEditCP(fboTexture);
>
> // create the main scene
> NodePtr mainScene = buildFlag(fboTexture, ::flagGeoHor, ::flagGeoVert);
>
> // create the fbo scene
> NodePtr fboScene = buildFBOScene(argc, argv);
>
> // create and setup the FBO
> setupFBO(fboTexture, gwin, fboScene);
>
> // create the window and initial camera/viewport
> ::mgr->setWindow(gwin);
>
> // tell the manager what to manage
> ::mgr->setRoot(mainScene);
>
> // show the whole scene
> ::mgr->showAll();
>
> // set a nicer background
> GradientBackgroundPtr bkg = GradientBackground::create();
> beginEditCP(bkg);
> bkg->addLine(Color3f(0.7, 0.7, 0.8), 0);
> bkg->addLine(Color3f(0.0, 0.1, 0.3), 1);
> endEditCP(bkg);
> gwin->getPort(0)->setBackground(bkg);
>
> // enable logo
> mgr->useOpenSGLogo();
>
> // make sure the window is setup before rendering to the FBO
> mgr->redraw();
>
> // enter the GLUT main loop
> glutMainLoop();
>
> return 0;
> }
>
> // copied from SimpleSceneManager
> Matrix showAll(NodePtr root, PerspectiveCameraPtr cam)
> {
> root->updateVolume();
>
> Vec3f min,max;
> root->getVolume().getBounds( min, max );
> Vec3f d = max - min;
>
> if(d.length() < Eps) // Nothing loaded? Use a unity box
> {
> min.setValues(-1.f,-1.f,-1.f);
> max.setValues( 1.f, 1.f, 1.f);
> d = max - min;
> }
>
> Real32 dist = osgMax(d[0],d[1]) / (2 * osgtan(cam->getFov() / 2.f));
>
> Vec3f up(0,1,0);
> Pnt3f at((min[0] + max[0]) * .5f,(min[1] + max[1]) * .5f,(min[2] +
> max[2]) * .5f);
> Pnt3f from = at;
> from[2]+=(dist+fabs(max[2]-min[2])*0.5f);
>
> // set the camera to go from 1% of the object to twice its size
> Real32 diag = osgMax(osgMax(d[0], d[1]), d[2]);
> beginEditCP(cam);
> cam->setFar (10 * diag);
> endEditCP(cam);
>
> Matrix m;
> MatrixLookAt(m, from, at, up);
>
> return m;
> }
>
> void animateFlag( Real64 t )
> {
> // get positions
> GeoPositions3fPtr pos =
> GeoPositions3fPtr::dcast(::flagGeo->getPositions());
> beginEditCP(pos, GeoPositions3f::GeoPropDataFieldMask);
> Pnt3f offset(-0.5f * flagWidth, 3, 0);
> float t2 = 8.0f * t;
> for(UInt32 i = 0; i < pos->getSize(); ++i)
> {
> Pnt3f p = pos->getValue(i);
> float v = p.dist(offset);
> // the flag geometry is centered at the origin
> // we need to offset the wave calculations
> float x = p[0] - offset.x();
> // make a wave, dampened towards the poleS
> p[2] = x * flagWaveDamp * osgsin(v-t2);
> pos->setValue(p, i);
> }
> endEditCP(pos, GeoPositions3f::GeoPropDataFieldMask);
>
> // correct normals
> calcVertexNormals(::flagGeo);
> }
>
> void spinFBOScene( Real64 t )
> {
> beginEditCP(::fboSceneTrans, Transform::MatrixFieldMask);
> Matrix m;
> Quaternion q;
> q.setValueAsAxisDeg(0, 1, 0, t * 16.66f);
> m.setRotate(q);
> ::fboSceneTrans->setMatrix(m);
> endEditCP(::fboSceneTrans, Transform::MatrixFieldMask);
> }
>
>
> // create a wood texture
> SimpleTexturedMaterialPtr createWoodMaterial()
> {
> SimpleTexturedMaterialPtr mat = SimpleTexturedMaterial::create();
> beginEditCP(mat);
> ImagePtr img = Image::create();
> createNoise(img, Image::OSG_L_PF, 7, 64);
> mat->setImage(img);
> mat->setEnvMode(GL_MODULATE);
> mat->setDiffuse(Color3f(0.9f, 0.57f, 0.1f));
> mat->setSpecular(Color3f(0.2f, 0.2f, 0.1f));
> TextureTransformChunkPtr ttrans = TextureTransformChunk::create();
> beginEditCP(ttrans);
> Matrix m;
> m.setScale(2.0, 8.0, 2.0);
> ttrans->setMatrix(m);
> endEditCP(ttrans);
> mat->addChunk(ttrans);
> endEditCP(mat);
>
> return mat;
> }
>
> NodePtr buildFlag(TextureChunkPtr fboTexture, const int &flagHor, const int
> &flagVert)
> {
> NodePtr flagScene = makeCoredNode<Group>();
>
> ::flagGeo = makePlaneGeo(flagWidth, flagHeight, flagHor, flagVert);
>
> // disable caching as we will change this geometry every frame
> beginEditCP(::flagGeo);
> ::flagGeo->setVbo(false);
> ::flagGeo->setDlistCache(false);
> endEditCP(::flagGeo);
>
> SimpleMaterialPtr fboMaterial = SimpleMaterial::create();
> beginEditCP(fboMaterial);
> fboMaterial->addChunk(fboTexture);
>
> // add a light glossy effect (environment noise-map)
> {
> ImagePtr noise = Image::create();
> createNoise(noise, Image::OSG_I_PF, 5, 256);
> beginEditCP(noise);
> // make noise image darker (as it will be GL_ADDed)
> for(int i = 0; i < noise->getSize(); ++i)
> noise->getData()[i] >>= 2; // *= 0.125
> endEditCP(noise);
> TextureChunkPtr gloss = TextureChunk::create();
> beginEditCP(gloss);
> gloss->setImage(noise);
> gloss->setEnvMode(GL_ADD);
> endEditCP(gloss);
> TexGenChunkPtr envMap = TexGenChunk::create();
> beginEditCP(envMap);
> envMap->setGenFuncS(GL_SPHERE_MAP);
> envMap->setGenFuncT(GL_SPHERE_MAP);
> endEditCP(envMap);
> // add for use with 2nd texture unit
> fboMaterial->addChunk(gloss, 1);
> fboMaterial->addChunk(envMap, 1);
> }
>
> fboMaterial->addChunk(TwoSidedLightingChunk::create());
> fboMaterial->setSpecular(Color3f(0.7f, 0.7f, 0.7f));
> fboMaterial->setDiffuse(Color3f(0.22f, 0.2f, 0.2f));
> endEditCP(fboMaterial);
>
>
> beginEditCP(::flagGeo);
> ::flagGeo->setMaterial(fboMaterial);
> endEditCP(::flagGeo);
>
> // create transform node to hook up the flag to the pole
> ComponentTransformPtr flagTrans;
> NodePtr flag = makeCoredNode<ComponentTransform>(&flagTrans);
> beginEditCP(flagTrans);
> Vec3f v(0.5f * flagWidth, 0.5f * (poleHeight - flagHeight) , 0.0f);
> flagTrans->setTranslation(v);
> endEditCP(flagTrans);
>
> // attach flag-geometry to transform-node
> beginEditCP(flag);
> flag->addChild(makeNodeFor(::flagGeo));
> endEditCP(flag);
>
> // build flag pole
> NodePtr pole = makeCylinder(poleHeight, poleDia, 24, true, true, true);
> MaterialPtr woodMat = createWoodMaterial();
> GeometryPtr cyl = GeometryPtr::dcast(pole->getCore());
> beginEditCP(cyl);
> cyl->setMaterial(woodMat);
> endEditCP(cyl);
>
> // attach objects to group node
> beginEditCP(flagScene);
> flagScene->addChild(flag);
> flagScene->addChild(pole);
> endEditCP(flagScene);
>
> return flagScene;
> }
>
> NodePtr buildFBOScene( int argc, char ** argv )
> {
> PointLightPtr light;
> NodePtr fboRoot = makeCoredNode<PointLight>(&light);
> ::fboCamBeacon = makeNodeFor(Transform::create());
>
> // attach camera beacon to root node
> beginEditCP(fboRoot);
> fboRoot->addChild(::fboCamBeacon);
> endEditCP(fboRoot);
>
> // set camera beacon as light beacon (-> headlight)
> beginEditCP(light);
> light->setBeacon(::fboCamBeacon);
> light->setOn(true);
> endEditCP(light);
>
> // load given model, the cow, or make a torus
> NodePtr scene;
> if(argc >= 2)
> scene = SceneFileHandler::the().read(argv[1]);
> else
> scene = SceneFileHandler::the().read("Data/cow.obj.gz");
>
> // fallback if loading failed
> if(!scene)
> scene = makeTorus(0.3, 4, 16, 64);
>
> NodePtr fboScene = makeCoredNode<Transform>(&::fboSceneTrans);
> beginEditCP(fboScene);
> beginEditCP(fboRoot);
> fboScene->addChild(scene);
> fboRoot->addChild(fboScene);
> endEditCP(fboRoot);
> endEditCP(fboScene);
>
> return fboRoot;
> }
>
> void setupFBO( TextureChunkPtr fboTexture, GLUTWindowPtr gwin, NodePtr
> fboScene )
> {
> // setup FBO
> ImagePtr img = Image::create();
> beginEditCP(img);
> img->set(Image::OSG_RGBA_PF, ::fboWidth, ::fboHeight);
> endEditCP(img);
> beginEditCP(fboTexture);
> fboTexture->setMinFilter(GL_LINEAR);
> fboTexture->setMagFilter(GL_LINEAR);
> fboTexture->setTarget(GL_TEXTURE_2D);
> fboTexture->setInternalFormat(GL_RGBA8);
> fboTexture->setImage(img);
> endEditCP(fboTexture);
>
>
> // add background
> GradientBackgroundPtr bg = GradientBackground::create();
> beginEditCP(bg);
> // flag of neutral-moresnet
> bg->addLine(Color3f(0.0, 0.0, 0.8), 0.000);
> bg->addLine(Color3f(0.0, 0.0, 0.8), 0.333);
>
> bg->addLine(Color3f(0.8, 0.8, 0.8), 0.333);
> bg->addLine(Color3f(0.8, 0.8, 0.8), 0.666);
>
> bg->addLine(Color3f(0.0, 0.0, 0.0), 0.666);
> bg->addLine(Color3f(0.0, 0.0, 0.0), 1.000);
> endEditCP(bg);
>
>
> // setup camera
> PerspectiveCameraPtr fboCam = PerspectiveCamera::create();
> beginEditCP(fboCam);
> // we already compensated aspect ratio with the texture/fbo sizes
> fboCam->setAspect(1.0);
> fboCam->setFov(osgdegree2rad(60));
> fboCam->setNear(0.01);
> fboCam->setFar(100);
> fboCam->setBeacon(::fboCamBeacon);
> endEditCP(fboCam);
>
> // create FBOViewport
> ::fboVP = FBOViewport::create();
> beginEditCP(::fboVP);
> ::fboVP->setSize(0, 0, ::fboWidth - 1, ::fboHeight - 1);
> ::fboVP->setStorageWidth(::fboWidth);
> ::fboVP->setStorageHeight(::fboHeight);
> ::fboVP->setBackground(bg);
> ::fboVP->setCamera(fboCam);
> ::fboVP->setParent(gwin);
> // attach texture as render target
> ::fboVP->getTextures().push_back(fboTexture);
> ::fboVP->setRoot(fboScene);
> ::fboVP->setFboOn(true);
> ::fboVP->setReadBuffer(true);
> endEditCP(::fboVP);
>
> // set the fbo camera to show the whole model
> TransformPtr trans = TransformPtr::dcast(::fboCamBeacon->getCore());
> beginEditCP(trans, Transform::MatrixFieldMask);
> trans->setMatrix(showAll(fboScene, fboCam));
> endEditCP(trans, Transform::MatrixFieldMask);
> }
>
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> ------------------------------------------------------------------------
>
> _______________________________________________
> Opensg-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensg-users
>
--
Dipl.-Inf. Eik Deistung
Multimediale Information + Präsentation
ZGDV e.V. E-Mail: [EMAIL PROTECTED]
(Computer Graphics Center) WWW : http://www.zgdv.de/
Joachim-Jungius-Str. 11 FAX : +49 381 446088
D-18059 Rostock, Germany Phone : +49 381 4024-169
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users