Ah, of course. I hadn't even thought about going into a callback. Hm. Still
a bit odd I can't do the initial setup in the beginning instead of having to
check and see if the buffer has been created every time.. but still, thanks
for the heads up. :)
J.P. Delport wrote:
> Hi,
>
> On 31/05/11 23:52, Kris Dale wrote:
>
> > Greetings all,
> >
> > I've been learning PBOs here lately, and I can't seem to find any
> > tutorials about how to use OSG::PixelBufferObjects. If anyone can
> > point me in the direction of one, that would be awesome, as I
> > wouldn't have to mix OGL and OSG code quite as much as I'm doing
> > now.
> >
> > Right now what I'm doing is trying to copy back the frame buffer to a
> > PBO each frame, but I can't get glGenBuffers to return a valid buffer
> > ID. I've tried passing in a single int or an array, but all I get
> > back are 0's. (In a strict GLUT/GL project, I get 1,2,3..)
> >
> > I've made sure (as much as I can) that I have a context.. I've
> > created a graphicscontext, a window exists, I've called
> > viewer.realize(), even tried one viewer.frame() before glGenBuffers.
> > All I can get back are 0's. So naturally when I try to bindbuffer /
> > readpixels / mapbuffer, I just get back a null pointer because my
> > bufferID is zero.
> >
> > Can anyone suggest a reason this might be happening? (Even if you
> > can point me to a good OSG tutorial on using OSG::PixelBufferObjects,
> > I'd still be curious to know.)
> >
> > Thanks in advance for any guidance anyone can offer..
> >
>
> you'll probably have to stick your code into a camera callback to make
> sure you have a valid context.
>
> See the osgscreencapture example for some use of PBO. I also paste some
> small example below that shows some methods for reading back texture data.
>
> HTH
> jp
>
> --8<--
>
> struct GPURegionOfInterestCallback : public osg::Camera::DrawCallback
> {
> GPURegionOfInterestCallback(ImageFormat& imf,
> osg::Image *osg_im,
> osg::TextureRectangle *tex) :
> ImageFormat_(imf),
> osg_im_(osg_im),
> trect_(tex)
> {
> pdbo_ = new osg::PixelDataBufferObject();
> pdbo_->setDataSize(ImageFormat_.getBytesPerImage());
> }
> virtual void operator() (osg::RenderInfo& renderInfo) const
> {
> // first get the texture into the pbo
> pdbo_->bindBufferInWriteMode(*renderInfo.getState());
> renderInfo.getState()->applyTextureAttribute(0, //unit
> trect_);
> glGetTexImage(trect_->getTextureTarget(),
> 0, //level
> GL_LUMINANCE,
> GL_UNSIGNED_BYTE,
> NULL);
>
> // now copy to cpu
> osg::GLBufferObject::Extensions* ext =
> osg::GLBufferObject::getExtensions(renderInfo.getState()->getContextID(),
> true);
> GLubyte* src =
> (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB,
>
> GL_READ_ONLY_ARB);
> if(src)
> {
> memcpy(osg_im_->data(), src,
> osg_im_->getTotalSizeInBytes());
> ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
> }
>
> pdbo_->unbindBuffer(renderInfo.getState()->getContextID());
>
> /*
> // direct to image from texture
> renderInfo.getState()->applyTextureAttribute(0, //unit
> trect_);
> glGetTexImage(trect_->getTextureTarget(),
> 0, //level
> GL_LUMINANCE,
> GL_UNSIGNED_BYTE,
> osg_im_->data());
> */
> }
>
> ImageFormat ImageFormat_;
> osg::Image* osg_im_;
> osg::TextureRectangle* trect_;
> osg::ref_ptr<osg::PixelDataBufferObject> pdbo_;
>
> };
>
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=40026#40026
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org