Hi Jean-Baptiste,

The most likely cause of the OpenGL error is that your code that is
calling glReadPixels doesn't have the graphics context current.  You
have to call OpenGL from the thread that has the graphics context
current. The easist way to do his is to attach a Camera post draw
callback, this will be called from the appropriate graphics threads.
If you are using 2.3.x or SVN then use Camera final draw calback as
it's called later in the draw pipeline.

Robert.

On Tue, Apr 1, 2008 at 6:47 PM, Jean-Baptiste Authesserre
<[EMAIL PROTECTED]> wrote:
> Hi everyone,
>
> I am trying to get screenshots of a generated scene with OSG. In order to do
> that I am using the method readPixels of the class osg::image. But it seems
> that the function glReadPixels used by readPixels fails. Here is a part of
> the code:
>
> //start the rendering
>     float * depthBufferRaw;
>     osg::Image * depthBuffer= new osg::Image();
>     unsigned char * tmp;
>
>     int height=1280;
>     int width=1024;
>     int i;
>     depthBufferRaw = (float *) calloc(height*width, sizeof(float));
>
>
>     while(!viewer->done())
>     {
>
>         viewer->frame();
>
>         //Get values of the color buffer
>         depthBuffer->readPixels(0,0,width,height,
> GL_LUMINANCE,GL_UNSIGNED_BYTE);
>
>          tmp =  depthBuffer->data();
>         for (i=0; i<height*width; i++)
>             depthBufferRaw[i]=(float) tmp[i];
>
>        //save as image
>        ...
>
>
>     }
>
> With the above code, i get an array (depthBufferRaw) with constant values
> whereas i see on my screen a scene with different objects and colors. Thanks
> to debug mode of VS2003, i can verify that depthBuffer->_data has been
> allocated.
>
> The source code of the osg::image method readPixels is the following:
>
> void Image::readPixels(int x,int y,int width,int height,GLenum format,GLenum
> type)
> {
>     allocateImage(width,height,1,format,type);
>
>     glPixelStorei(GL_PACK_ALIGNMENT,_packing);
>
>     glReadPixels(x,y,width,height,format,type,_data);
> }
>
> So, it seems that glReadPixels failed. I tried to show this by using
> directly glReadPixels in my implementation with glGetError.
>   Strangely glGetError returns the value 1282 (GL_INVALID_OPERATION)
> whatever the position of the call to this function in my code. And when i
> tried to use this function in a loop as :
> while (errCode != GL_NO_ERROR)
>        errCode = glGetError();
>
> I obtain an infinite loop.
>
> My questions are the following:
> -Is that possible to use glGetError with OSG?
> -Has anybody an idea of why the method readPixels fails in this case?
>
> Thanks in advance!
>
> Jean-Baptiste
> _______________________________________________
>  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

Reply via email to