Note that there are some explanatory texts on larger screens.

plurals
  1. PODrawing into OpenGL ES framebuffer and getting UIImage from it on iPhone
    primarykey
    data
    text
    <p>I'm trying to do offscreen rendering of some primitives in OpenGL ES on iOS. The code is as follows:</p> <pre><code>// context and neccesary buffers @interface RendererGL { EAGLContext* myContext; GLuint framebuffer; GLuint colorRenderbuffer; GLuint depthRenderbuffer; } </code></pre> <p>.m file:</p> <pre><code>- (id) init { self = [super init]; if (self) { // initializing context myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; [EAGLContext setCurrentContext:myContext]; [self setupOpenGL]; // creating buffers } return self; } -(void) setupOpenGL { int width = 256; int height = 256; // generating buffers and binding them as Apple,s tutorial says glGenFramebuffersOES(1, &amp;framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glGenRenderbuffersOES(1, &amp;colorRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); glGenRenderbuffersOES(1, &amp;depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) ; if(status != GL_FRAMEBUFFER_COMPLETE_OES) { NSLog(@"failed to make complete framebuffer object %x", status); } } - (UIImage *) renderImage { int width = 256; int height = 256; [EAGLContext setCurrentContext:myContext]; glEnable(GL_DEPTH_TEST); // clear color - cyan glClearColor(0.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // trying to draw some primitive - red line float line[] = {-0.5f, -0.5f, 0.5f, 0.5f}; glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); //should I do this? glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, line); glColor4f(1.0, 0.0, 0.0, 1.0); glLineWidth(10); glDrawArrays(GL_LINES, 0, 2); // draw line with two points [myContext presentRenderbuffer:GL_RENDERBUFFER_OES]; // and this? // then I grab image from _frameBuffer and return it as UIImage - this part is working NSInteger x = 0, y = 0; NSInteger dataLength = width * height * 4; GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte)); glPixelStorei(GL_PACK_ALIGNMENT, 4); glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL); CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGImageRef iref = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, true, kCGRenderingIntentDefault); UIGraphicsBeginImageContext(CGSizeMake(width, height)); CGContextRef cgcontext = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(cgcontext, kCGBlendModeCopy); CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, width, height), iref); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); free(data); CFRelease(ref); CFRelease(colorspace); CGImageRelease(iref); return image; } </code></pre> <p>the problem is that -renderImage returning completely cyan image, without red line. What can it be? Did I missed some actions before drawing line?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload