Hi, All.
following is the piece of my testing code used to handle ping-pong.
The problem is, the drawing result shows that the first shader (pingpongShaderProgram, render to FBO)did not take effect. When I remove the second shader( renderShaderProgram), the first shader took effect. could anybody please explain the reason?
setting FBO
glGenFramebuffersEXT(1, &my_fbo_tex);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, my_fbo_tex);
// init texture for FBO
glGenTextures( 1, & my_pp_tex);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, my_pp_tex);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, texW, texH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0);
// bind texture
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_RECTANGLE_ARB,my_pp_tex,0);
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
assert(status == GL_FRAMEBUFFER_COMPLETE_EXT);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
using FBO
glUseProgramObjectARB(pingpongShaderProgram);
// render to FBO
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, my_fbo_tex);
glPushAttrib(GL_VIEWPORT_BIT);
// set projection && modelview
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, myMaxTextureSize[0], 0, myMaxTextureSize[1]);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glViewport(0, 0,myMaxTextureSize[0], myMaxTextureSize[1]);
int pptexture = glGetUniformLocationARB(pingpongShaderProgram, "ppTexture");
glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, my_test_tex);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(0.0 , 0.0);
glTexCoord2f(1.0, 0.0); glVertex2f(myMaxTextureSize[0] , 0.0);
glTexCoord2f(1.0, 1.0); glVertex2f(myMaxTextureSize[0] , myMaxTextureSize[1]);
glTexCoord2f(0.0, 1.0); glVertex2f(0.0 , myMaxTextureSize[1]);
glEnd();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glUseProgramObjectARB(renderShaderProgram);
//
//
// use FBO texture
glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT);
// glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
int fbtexture = glGetUniformLocationARB(renderShaderProgram , "fbtexture");
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, my_pp_tex);
pingpongShaderProgram:
"
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
"
renderShaderProgram:
"
void main(void)
{
vec4 color = vec4(0.0);
color = texture2D(fbtexture, gl_TexCoord[0].st);
gl_FragColor = color;
}
"
When use both shaders, I am expecting that finally a red image is displayed, but I got my_test_tex pattern.
tks