2011-10-22 5 views
6

私は新しいiOS 5フレームワークGLKitによって追加された機能を利用するために、私自身のOGLES 2.0フレームワークを変換してきました。iOS 5 + GLKView:カラーベースの頂点ピッキングのピクセルRGBデータへのアクセス方法

結果を気に入ったら、今度はhereと記載されているカラーベースのピッキングメカニズムを実装したいと考えています。このためには、タッチピクセルRGBA値を取得するためにバックバッファにアクセスする必要があります。この値は、頂点/プリミティブ/表示オブジェクトの一意の識別子として使用されます。もちろん、これには、すべての頂点/プリミティブ/表示オブジェクトの一時的な独特の色付けが必要です。

は、私は2つの質問があり、私はどちらかと援助のために非常に感謝されるだろう:

  1. 私はGLKViewControllerGLKView、(GLKViewの)CAEAGLLayerEAGLContextへのアクセス権を持っています。また、すべてのOGLES 2.0 バッファ関連のコマンドにアクセスできます。これらを組み合わせて、EAGLContextのピクセルの色 を識別するにはどうすればいいですか?画面をタップしていますか?

  2. 私は私のレンダリングを行うために頂点バッファオブジェクトを使用していることを考えると、第1バッファリング頂点(色) 属性を変更する必要ありません、私の頂点シェーダ に提供される色を無効にするきちんとした方法があり、第2に、IF ステートメントを頂点シェーダに追加する必要はありませんか?

私は(2)「ノー」であるが、性能および非骨の折れるコード刷新の理由のために、私はより多くの経験豊富な誰かに確認することが賢明と思った答えを想定しています。

感謝の意を表します。さて、私は今glReadPixelsを使用してアクティブフレームバッファからピクセルデータを読み取る方法を知っている

UPDATE

お時間をいただき、ありがとうございます。だから、私はちょうどバックバッファに特別な "ユニークな色"のレンダリングをしなければならないと思って、簡単にそれに切り替え、ピクセルを読んでから元に戻します。これは必然的に視覚的なちらつきを作りますが、私はそれが最も簡単な方法だと思います。画面のスナップショットからCGImageContextRefを作成し、その方法を分析するよりも、はるかに速く(そしてより賢明な)

でも、バックバッファーに関するヒントは非常に高く評価されます。

答えて

11

さて、私はこれをできるだけ簡潔にする方法を厳密に決めました。私はこれを達成し、タッチインタラクションは、ピクセルを選択することができるようにするために、すべてのコードに必要な:)

を一覧表示する、最初のごGLKViewControllerサブクラスにUITapGestureRecognizerを追加する方法について説明下に(あなたはTAP-に選択ピクセルたいと仮定した場合)そのクラスの中に以下のターゲットメソッドを持ちます。、あなたのジェスチャー認識をインスタンス化した後

@interface GLViewController : GLKViewController <GLKViewDelegate, UIGestureRecognizerDelegate> 

GLKViewControllerで実際GLKViewある)viewプロパティに追加:あなたのGLKViewControllerサブクラスUIGestureRecognizerDelegateをしなければならない

// Inside GLKViewController subclass init/awakeFromNib: 
[[self view] addGestureRecognizer:[self tapRecognizer]]; 
[[self tapRecognizer] setDelegate:self]; 

のターゲットアクションを設定します。あなたのジェスチャーレコグナイザー。 init...を使って作成するときにこれを行うことができますが、Storyboard(別名「Xcode 4.2の新しいInterface Builder」)を使用して私の鉱山を作成し、それを配線しました。

とにかく、ここに私のターゲットアクションをタップジェスチャー認識のためだ:

-(IBAction)onTapGesture:(UIGestureRecognizer*)recognizer { 
    const CGPoint loc = [recognizer locationInView:[self view]]; 
    [self pickAtX:loc.x Y:loc.y]; 
} 

そこに呼ばれるピック方法は、私は私のGLKViewControllerサブクラス内で定義した1がある:

-(void)pickAtX:(GLuint)x Y:(GLuint)y { 
    GLKView *glkView = (GLKView*)[self view]; 
    UIImage *snapshot = [glkView snapshot]; 
    [snapshot pickPixelAtX:x Y:y]; 
} 

これは利用していますAppleが親切にGLKViewに含まれており、EAGLContextからUIImageを生成する便利な新しいメソッドsnapshotを公開しました。注意することが重要です何

は述べてsnapshot APIドキュメント、内のコメントです:

をアプリケーションが明示的 ビューの内容を必要とするたびに、このメソッドが呼び出されるべきです。 OpenGL ES関数を使用して、下にあるフレームバッファの内容を直接読み取ろうとしないでください。

これは私のピクセルデータにアクセスしようとする試みでglReadPixelsを呼び出すために私の以前の試みはEXC_BAD_ACCESSを生成した理由として手掛かり、代わりに正しい道を私を送っ指標を与えました。

私のpickAtX:Y:メソッドが瞬間で定義されていることに気づくでしょう。私はUIImagepickPixelAtX:Y:を呼び出します。これは、カスタムカテゴリのUIImageに追加した方法です。

これは実装です。それは必要な最終的なコードリストです。コードはthis questionから来たとの回答に応じて改正されたが受け取ら:2を必要な「CGImageコンテキストからピクセルデータの取得」:

@implementation UIImage (NDBExtensions) 

- (void)pickPixelAtX:(NSUInteger)x Y:(NSUInteger)y { 

    CGImageRef cgImage = [self CGImage]; 
    size_t width = CGImageGetWidth(cgImage); 
    size_t height = CGImageGetHeight(cgImage); 

    if ((x < width) && (y < height)) 
    { 
     CGDataProviderRef provider = CGImageGetDataProvider(cgImage); 
     CFDataRef bitmapData = CGDataProviderCopyData(provider); 
     const UInt8* data = CFDataGetBytePtr(bitmapData); 
     size_t offset = ((width * y) + x) * 4; 
     UInt8 b = data[offset+0]; 
     UInt8 g = data[offset+1]; 
     UInt8 r = data[offset+2]; 
     UInt8 a = data[offset+3]; 
     CFRelease(bitmapData); 
     NSLog(@"R:%i G:%i B:%i A:%i",r,g,b,a); 
    } 
} 

@end 

を私はもともと題しアップルのAPIドキュメントで見つかったいくつかの関連のコードを試してみましたこの1の代わりにメソッド定義が必要ですが、もっと多くのコードが必要です。正しい解釈を実装できなかったタイプのデータがあります。void *です。

これだけです!それは形式で出力することを意志ピクセルタップすると、あなたのプロジェクトにこのコードを追加します。

R:24 G:46 B:244 A:255 

はもちろん、あなたが範囲0になり、それらのRGBAのint型の値を(抽出するいくつかの手段を記述する必要がありますが - 255)、それらを使用したいと思っています。私は今、全体のピッキング機構を終えたし、それが御馳走:) Huzzahに動作します

UIColor *color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f]; 
+0

:一つのアプローチは、そうのようにインスタンス化上記の方法からUIColorを返すことです! – KomodoDave

+0

これは本当に素晴らしいことです、投稿してくれてありがとう! – todd412

+0

あなたは大歓迎です:) – KomodoDave

関連する問題