PDA

View Full Version : How to copy a texture with FBO for N times



Ehsan Kamrani
12-31-2010, 09:37 AM
I want to copy a texture for N times using FBO. Can you give me an example?
How many FBOs do I need to do it?( one FBO with 2 textures attached to it or two FBOs with one texture attached to each of them )

mobeen
12-31-2010, 10:19 AM
hi,
FBOs enable u offscreen rendering. For copying u can use glCopyTex[Sub]Image2D, glGetTexImage2D etc. or similar functions.

Regards,
Mobeen

Ehsan Kamrani
12-31-2010, 11:24 AM
I want to use FBO to "render to texture".
someone at gamedev had asked this question before:
http://www.gamedev.net/community/forums/topic.asp?topic_id=519459

Alfonse Reinheart
12-31-2010, 12:41 PM
I want to use FBO to "render to texture".
someone at gamedev had asked this question before:

First, that's not rendering to a texture. That's shader-based blending operations. You should only do that if the various blend functions are insufficient for your needs. And that's semi-rare.

Second, the question was answered quite nicely on the thread you mentioned.

Ehsan Kamrani
12-31-2010, 12:54 PM
You can see my post in the advanced forum-- The glow effect. The author has used 2 pBuffers. So I want to do the same thing with FBOs.
I want to:
for( int i = 0; i < N; i++ )
{
if( i is even )
{
Bind the first texture of the FBO
render to the second texture of FBO
}
if( i is odd )
{
Bind the socond texture of the FBO
render to the first texture
}
}

BTW, how can I switch between different textures of the FBO?

mobeen
01-02-2011, 12:42 AM
Hi,
This technique u r referring to is called ping ponging. To accompalish this, you would need to create two attchmts to your fbo. Then in the rendering loop you will do this,


//create two globals
int readID=0, writeID=1;
GLuint texID[2];// color attchmts of FBO

//render func. code
GLenum color_attmts[2]={GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1};
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboID);
for(int i=0;i<N;i++) {
glDrawBuffer(color_attmts[writeID]);
glUseProgram(progID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE2D, texID[readID]);
glUniform1i(texture_loc, 0);
DrawFullScreenQuad();
glUseProgram(0);

int tmp=readID;
readID = writeID;
writeID=tmp;
}
Try this and see if you get what u were looking for.

Regards,
Mobeen