2012-02-22 16 views
31

GLKitを使用するためにApples GLPaintの例を移植しようとしています。 UIViewを使用すると、ビューのCAEAGLLayerを返し、drawablePropertiesにkEAGLDrawablePropertyRetainedBackingを含めることができます。これは、レンダリングバッファを提示した後に描画可能な内容を保持するという効果が期待どおりに発生します。このプロパティを削除すると、描画可能なコンテンツの一部が異なるバッファに描画されているように、描画呼び出し後にちらつきが発生します。GLKView描画可能なプロパティー

問題はこれが私の現在のGLKViewでの問題ですが、描画可能なプロパティを設定する方法がないようです。 CAEAGLLayerを返してプロパティを設定しても効果はありませんし、保持されているバッキングを設定するためのGLKViewの関連プロパティは表示されません。

他に誰かがこの問題を抱えているのですか?

+0

私は解決策はありませんが、保持されたバッキングモードが完全に狂っている網膜モードでは、新しいiPadにドライバのバグがあることに注意してください。ここでは議論と回避策があります:http://stackoverflow.com/questions/9753230/ipad-3-opengl-bug-with-keagldrawablepropertyrequired-back-and-retina –

+0

デリゲートメソッドで描画していますか?あなたは明確なステップを使用していますか? – nielsbot

+0

私は正直であることを覚えていません。私はちょうどCAEAGLLayerを使用して終了しましたが、行列の数学とテクスチャの読み込みにGLKitを使用しました。 – Brett

答えて

2

これが機能するかどうかを確認しますが、ここで我々が持っているいくつかのコードではありません:

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; 

あなたはeaglLayer.drawablePropertiesにアクセスすることができるはずですが。うまくいけば、あなたが望むパラメータを設定することができます。

+0

賞金ありがとう! – Liron

+0

この回答は実際にkEAGLDrawablePropertyRetainedBackingを設定するためには機能しません(少なくともiPad 3では)。 GLKViewは、コンテキストからrenderBufferStorageを生成するときにレイヤプロパティを上書きします。私はこれを回避するための答えを以下に掲示しました。 – simeon

-2

こんにちはあなたはGLKViewでkEAGLDrawablePropertyRetainedBackingを取得したい場合は、プロジェクトに以下のカテゴリを追加し、この1

GLKView * const view = (GLKView *)self.view; 
view.context = self.context; 
view.delegate = self; 
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; 
view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
view.drawableMultisample = GLKViewDrawableMultisampleNone; 
self.preferredFramesPerSecond = 10; 

[EAGLContext setCurrentContext:self.context]; 
CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer; 
+1

ここに新しい情報はありますか? –

8

を試してみてください。それはその描画可能に結合し、そのレンダリングのストレージを生成するときGLKViewは、これらのプロパティが上書きされるため動作しませんGLKViewによって維持CAEAGLLayerにdrawablePropertiesを設定

@interface CAEAGLLayer (Retained) 

@end 

@implementation CAEAGLLayer (Retained) 

- (NSDictionary*) drawableProperties 
{ 
    return @{kEAGLDrawablePropertyRetainedBacking : @(YES)}; 
} 

@end 

。このメソッドを使用すると、GLKViewはカテゴリの返されたdrawablePropertiesを代わりに使用します。

+0

これはデプスバッファーの読み取りにも使えますか?私はこのコードを試してみましたが、Z値の読み込みは常に0ですか? – Bram

7

シメオンの回答は機能しますが、アプリケーション内のすべてのEAGLベースのビューの動作が変更されます。

@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 

この

@interface RetainedGLKView : GLKView 
@end 

@implementation RetainedGLKView 
+ (Class)layerClass { 
    return [RetainedEAGLLayer class]; 
} 
@end 
:このように、私はそうではない、いくつかの裏には強制的に必要な景色などを持っているので、私はGLKViewとCEAGLLayerのサブクラスを作成することによって、わずかに異なる解決策を考え出しました

これで、保持されているバッキングを強制したいビューに対して、GLKViewの代わりにRetainedGLKViewを使用できます。あなたのGLKView実装ファイルで

+0

ありがとうございます、あなたのソリューションは私のために働いた。 – lppier

1

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if ((self = [super initWithCoder:aDecoder])) 
    { 
     _eaglLayer = (CAEAGLLayer *)self.layer; 

     _eaglLayer.opaque = TRUE; 
     _eaglLayer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking : [NSNumber numberWithBool:NO], 
              kEAGLDrawablePropertyColorFormat  : kEAGLColorFormatRGBA8}; 

    } 
    return self; 
} 

私は、人々は非常に複雑なものを作るために管理する方法がわかりません。それはこのようなもので、これだけです。

関連する問題