Hi, I am rendering to texture on an FBO, I then render that texture to my screen, the problem is, no matter what I order I draw my scene in, the FBO drawn texture is rendered on top, it should be rendered at the bottom:
eg:
Background text <-rendered from FBO
Fruit images <- should render on top
but the the background always renders on top!
I think it's something to do with how I am creating the texture in the AddToTexture method, any ideas?
Setup
Code:
GLuint es1myTextureId;
GLuint es1tmpFrameBuffer;
glGenFramebuffersOES(1, &es1tmpFrameBuffer);
glGenTextures ( 1, &es1myTextureId );
glBindTexture ( GL_TEXTURE_2D, es1myTextureId );
glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, del.BufferWidth, del.BufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
Render loop
Code:
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClearDepthf(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glOrthof(0, del.Width, 0, del.Height, -1, 1);
[self AddToTexture];
[self DrawGeneratedTexture:es1myTextureId];
[self DrawFruit];
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
Helpers:
Code:
-(void)AddToTexture
{
glEnable ( GL_BLEND );
glBlendFunc ( GL_SRC_ALPHA, GL_ONE );
glBindFramebufferOES(GL_FRAMEBUFFER_OES, es1tmpFrameBuffer);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, es1myTextureId, 0);
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
printf("CANNOT CREATE FRAMEBUFFER\n");
}
for (UITouch *touch in del.GameRef.TouchSet) {
float s[3];
s[0] = 100;
s[1] = 100;
s[2] = 100;
CGPoint touchPoint = [touch locationInView:del.GameRef.ViewRef];
int x = touchPoint.x - 16;
int y = touchPoint.y - 16;
int w = 32;
int h = 32;
GLfloat vertices[] = {
x, y, 0,
x+w, y, 0,
x, y+h, 0,
x+w, y+h, 0,
};
GLfloat texCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, del.textureBrush);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
glDisable ( GL_BLEND );
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
}
Code:
-(void)DrawGeneratedTexture:(GLuint)te
{
int w = del.BufferWidth;
int h = del.BufferHeight;
GLfloat vertices[] = {
0, 0,
w, 0,
0, h,
w, h,
};
GLfloat texCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, te);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
}