PDA

View Full Version : how to display the data from FrameBuffer to displa



manchinasetti
01-08-2010, 05:42 PM
Hi,

I am a newbie to opengl. I need to output the data available in the frame buffer to the display. I have a version of code in which the data is read from the frame buffer and will be written to the file. Now I need to modify the code to display. I created a window, and I want the frame buffer output to be displayed to this output window. Please tell me how to do it.

Current version of code that reads from framebuffer and writes to a file.


glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
glReadBuffer(DRAW_BUFFERS[srcIndex]);
glBindBuffer(GL_PIXEL_PACK_BUFFER,readbackBuffer[src]);
glReadPixels(0,0,Width,height, GL_BGRA, GL_UNSIGNED_BYTE,0)); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);


glBindBuffer(GL_PIXEL_PACK_BUFFER, readbackBuffer[src]);
data = (BYTE *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
/* copy to a local buffer in application which is used for during file write */
CopyData(dst,Width,data,Width,Height);

glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);


Now I want to directly write the output of 'DRAW_BUFFERS[srcIndex]' directly display to window.

Thanks in advance.

-Manchinasetti

dehebo
01-08-2010, 06:18 PM
Been messing around with these myself the last few days, so I can try to help. Bare in mind this is extremely new to me, but it works.
I plan to tidy my implementation up alot, and it is about as simple as an FBO can get or there about.

I think I'm starting down the right line, it works atleast :)

Would also love any comments back for improvements... but I am already aware this is v.basic implementation.



// FBO Globals

GLuint g_FBO;
GLuint g_FBOImg;


// Initiliased in main init()


GLvoid InitShaders()
{
shader1 = new Shader( ..."filepath"... );
shader1->UseShader();
shader1->SetAttribute1i( "render", g_FBOImg );
}

GLvoid InitFBOTexture(GLuint &tex)
{
glGenTextures( 1, &tex );

glActiveTexture( GL_TEXTURE0 + tex );
glBindTexture( GL_TEXTURE_2D, tex );

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, g_WindowWidth, g_WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
}


GLvoid InitFBO()
{
GLuint m_Depthbuffer;

// Get handle to & bind FBO
glGenFramebuffersEXT( 1, &g_FBO );
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, g_FBO );

// Init depth render buffer and attach to bound FBO
glGenRenderbuffersEXT( 1, &m_Depthbuffer );
glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_Depthbuffer );
glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, g_WindowWidth, g_WindowHeight );

// Init and attach texture to FBO
InitFBOTexture( g_FBOImg );
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0 );

// And attach it to the FBO so we can render to it
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0);

glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_Depthbuffer );

GLenum renderTarget[] = {GL_COLOR_ATTACHMENT0_EXT};
glDrawBuffers( 1, renderTarget );
// Check status of FBO
if ( glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT )
{
std::cout << "Failed to initialise FBO" << std::endl;
exit( 1 );
}

// Unbind FBO
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}


This is then in my RenderScene()


// Bind FBO
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, g_FBO );
// Save viewport information and set to FBO's texture size
glPushAttrib( GL_VIEWPORT_BIT );
glViewport( 0, 0, g_WindowWidth, g_WindowHeight );

// Clear colour and depth buffer
glClearColor( ... );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();

// SET UP SCENESCENE.. RENDERED TO FBO

// Restore previous viewport information & disable FBO
glPopAttrib();
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );

glClearColor( ... );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glDisable( GL_DEPTH_TEST );
ViewOrtho();
shader1->UseShader(); // Fragment shader to fullscreen quad

glBegin( GL_QUADS );
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glTexCoord2f(0,1);
glVertex2f( 0, 0 );
glTexCoord2f(0,0);
glVertex2f( 0, g_WindowHeight );
glTexCoord2f(1,0);
glVertex2f( g_WindowWidth, g_WindowHeight );
glTexCoord2f(1,1);
glVertex2f( g_WindowWidth, 0 );
glEnd();
ViewPerspective();
glEnable(GL_DEPTH_TEST);


Basic fragment shader used to render to full screen quad


uniform sampler2D render;

void main(void)
{
gl_FragColor = texture2D( render, gl_TexCoord[0].xy);
}

dehebo
01-08-2010, 06:28 PM
o yeah, dont forget to clean up and delete stuff on close or whenever

dehebo
01-09-2010, 04:51 AM
just realised in my code had duplicate lines...



glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0 );

// And attach it to the FBO so we can render to it
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0);


obviously need only once :eek: