Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I had a very similar problem - to render some lines and get UIImage. I used OpenGL ES 1.1 and multisampling. I removed some additional code that does not refers to rendering and some OpenGL error checks. You can find the full code here: <a href="https://github.com/medvedNick/Mapsforge_iOS/blob/master/OpenStreetPad/OpenStreetPad/OSPRendererGL.m">OSPRendererGL</a>. Also, sorry for my one-for-all method.</p> <pre><code>@interface OSPRendererGL { EAGLContext* myContext; GLuint framebuffer; GLuint colorRenderbuffer; GLuint depthRenderbuffer; GLuint _vertexArray; GLuint _vertexBuffer; GLuint resolveFramebuffer; GLuint msaaFramebuffer, msaaRenderbuffer, msaaDepthbuffer; int width; int height; } @implementation OSPRendererGL - (id) init { self = [super init]; if (self) { myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; [EAGLContext setCurrentContext:myContext]; [self setupOpenGL]; [EAGLContext setCurrentContext:nil]; width = 256; height = 256; } return self; } -(void) setupOpenGL { 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); glGenFramebuffersOES(1, &amp;msaaFramebuffer); glGenRenderbuffersOES(1, &amp;msaaRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, msaaRenderbuffer); glGenRenderbuffersOES(1, &amp;msaaDepthbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaDepthbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT16_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, msaaDepthbuffer); } -(UIImage *) renderImageAtZoom:(int)zoom { CGRect b = CGRectMake(0, 0, width, height); OSPCoordinateRect r = OSPRectForMapAreaInRect([self mapArea], b); double_scale = b.size.width / r.size.x; double scale = 1.0/_scale; [EAGLContext setCurrentContext:myContext]; glBindFramebuffer(GL_FRAMEBUFFER_OES, msaaFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderbuffer); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(0.0f, 256.0f, 256.0f, 0.0f, 1.0f, -1.0f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glScalef(_scale, _scale, 1); glTranslatef(-r.origin.x, -r.origin.y, 0); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); glEnable(GL_BLEND); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // rendering here glPopMatrix(); // msaa glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer); glResolveMultisampleFramebufferAPPLE(); glBindFramebuffer(GL_FRAMEBUFFER_OES, framebuffer); glBindRenderbufferOES(GL_RENDERBUFFER, colorRenderbuffer); // grabbing image from FBO GLint backingWidth, backingHeight; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &amp;backingWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &amp;backingHeight); 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); [EAGLContext setCurrentContext:nil]; return image; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    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