1
votes

I'm trying to create OpenGL ES 1.1 texture and fill is with rendered content.

Preparing a texture:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

GLuint texFrambuffer;
glGenFramebuffers(1, &texFrambuffer);
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"failed to make complete framebuffer object %x", status);
    // this message doesn't appear, thus, framebuffer is complete
}

glViewport(0, 0, 32, 32);

glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

GLfloat vertices[] = {
    10.0f, 10.0f, 0.0f,
    20.0f, 40.0f, 0.0f,
    10.0f, 30.0f, 0.0f
};
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &texFrambuffer);

Rendering texture into scene:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1};
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f};
glVertexPointer(2, GL_FLOAT, 0, vertices2);
glTexCoordPointer(2, GL_SHORT, 0, texCoord);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisable(GL_TEXTURE_2D);

Full source code is available at Bitbucket: https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m

There other content is rendered correctly. Issue is only with this texture – it renders as a white rectangle.

I have studied a lot of example, but still can't figure out what I doing wrong. What is missing?


Update 1: I have noticed, if I set glClearColor() and call glClear() while texFrambuffer is bound, these changes is saved to my texture. Thus, there is something wrong with glDrawArrays() and/or related things.

Do I need set matrix mode and projection specifically for my texFrambuffer?


Update 2: I have tried also to use glCopyTexImage2D to copy content from "main" framebuffer to a texture.

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glViewport(0, 0, 32, 32);

glClearColor(1.0f, 0.75f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
GLfloat vertices[] = {
    0.0f, 0.0f, 0.0f,
    20.0f, 32.0f, 0.0f,
    10.0f, 30.0f, 0.0f
};
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

glBindTexture(GL_TEXTURE_2D, texture);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0);

Full source code available at Bitbucket: https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m

The result is the same. Only filled rectangle. It looks like there is definitely issue with my matrices.

1
Shoudln't you be using glGenFramebuffersOES, glBindFramebufferOES, and so on... OES functions, instead of core? Because ES 1.1 doesn't have Framebuffer objects in core, they are available as extension.Mārtiņš Možeiko
It seems Apple has merged APIs. There is no difference to use methods with OES and without OES.Aleksejs Mjaliks
What do you mean - merged? It's written even in Apple documentation: developer.apple.com/library/ios/#documentation/3DDrawing/… (Framebuffer Objects are the Only Rendering Target on iOS) That on GLES 1.1 you should be using OES_framebuffer_object extension.Mārtiņš Možeiko
@MārtiņšMožeiko I have just tried to fix my example, by using OES methods. There is no difference in result at all. Even more, I have added glClearColor() and glClear() calls, while texFramebuffer is bound. Now I get texture filled with this colour. Thus, FBOs works fine (even without OES). But I still missing triangle drawn by glDrawArrays().Aleksejs Mjaliks
@MārtiņšMožeiko Here is code all with OES functions. Still no desired result: bitbucket.org/amjaliks/gl2/src/328701fcd2f7/GL2/GL2View.m :(Aleksejs Mjaliks

1 Answers

0
votes

Your problem is with matrices. By default projection matrix is identity. Thus giving (-1,-1)-(+1,+1) coordinates for viewport. Most likely you need orthographic projection to (0,0)-(32,32) square.