GLKView set drawable properties

后端 未结 3 1789
梦如初夏
梦如初夏 2021-02-11 17:31

I\'m trying to port Apples GLPaint example to use GLKit. Using a UIView, its possible to return the CAEAGLLayer of the view and set the drawableProperties to include kEAGLDrawab

相关标签:
3条回答
  • 2021-02-11 18:06

    Not sure if this will work but here is some code we have:

    GLKView * const view = (GLKView *)self.view;  
    view.context = self.context;
    view.delegate = self;
    view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    view.drawableMultisample = GLKViewDrawableMultisampleNone;
    self.preferredFramesPerSecond = 30;
    
    [EAGLContext setCurrentContext:self.context];
    CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer;
    eaglLayer.opaque = YES;
    

    You should be able to access eaglLayer.drawableProperties. Hopefully that lets you set the parameter you want.

    0 讨论(0)
  • 2021-02-11 18:15

    Simeon's answer works but changes the behavior for all EAGL-based views in an application. I have some views which need the backing forced and others which don't, so I came up with a slightly different solution by creating subclasses of GLKView and CEAGLLayer, like this:

    @interface RetainedEAGLLayer : CAEAGLLayer
    @end
    
    @implementation RetainedEAGLLayer
    - (void)setDrawableProperties:(NSDictionary *)drawableProperties {
        // Copy the dictionary and add/modify the retained property
        NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] initWithCapacity:drawableProperties.count + 1];
        [drawableProperties enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
            // Copy all keys except the retained backing
            if (![key isKindOfClass:[NSString class]]
            || ![(NSString *)key isEqualToString:kEAGLDrawablePropertyRetainedBacking])
                [mutableDictionary setObject:object forKey:key];
        }];
        // Add the retained backing setting
        [mutableDictionary setObject:@(YES) forKey:kEAGLDrawablePropertyRetainedBacking];
        // Continue
        [super setDrawableProperties:mutableDictionary];
        [mutableDictionary release];
    }
    @end
    

    and this

    @interface RetainedGLKView : GLKView
    @end
    
    @implementation RetainedGLKView
    + (Class)layerClass {
        return [RetainedEAGLLayer class];
    }
    @end
    

    Now I can just use RetainedGLKView instead of GLKView for those views where I want to force a retained backing.

    0 讨论(0)
  • 2021-02-11 18:19

    If you want to get kEAGLDrawablePropertyRetainedBacking in a GLKView, add the following category to your project.

    @interface CAEAGLLayer (Retained)
    
    @end 
    
    @implementation CAEAGLLayer (Retained)
    
    - (NSDictionary*) drawableProperties
    {
        return @{kEAGLDrawablePropertyRetainedBacking : @(YES)};
    }
    
    @end
    

    Setting the drawableProperties on the CAEAGLLayer maintained by the GLKView doesn't work because the GLKView overwrites those properties when it binds its drawable and generates its render storage. Using this method forces the GLKView to use your category's returned drawableProperties instead.

    0 讨论(0)
提交回复
热议问题