2012-01-28 8 views
1

iOSのレンダリングにフレームバッファオブジェクトを使用すると、AppleのiOS向けOpenGL ESプログラミングガイドに従ってiOS上でレンダリングするのが好ましいと思われます。幅と高さなどのプロパティを指定するには、glRenderbufferStorage()を使用する必要があります。 Munshi、Ginsburg、ShreinerのOpenGL ES 2.0プログラミングガイドへ。 Appleはこれを上記のguideのEAGLContextに送られたrenderbufferStorage:fromDrawable:メッセージで置き換えます。OpenGL ESのCAEAGLLayerプロパティを設定していますか?

アップリケは、Renderbufferから幅と高さを取得するように書いています。詳細については何も書かれていません。

幅と高さは0です。

CAEAGLLayer Class Referenceは、「ディスプレイのサイズに合わせてレイヤーの境界を設定する」と書いています。 CAEAGLLayerクラスは、Appleが使用するビューのバッキングクラスとして使用するクラスです。これは、viewClassメソッドから返すことで行われます。このCAEAGLLayerには、NSDictionaryである1つのプロパティ "drawableProperties"しかありません。残念ながら、そのドキュメントはまばらです。寸法は設定できません。

したがって、OpenGL ESのCAEAGLLayerプロパティを設定するにはどうすればよいですか?

はここに(私はどちらか推測したり、どこか私はinitWithFrameを使用することを覚えていないからだ、initWithCoderを使用して、アップルの古い例注)これまでに私のコードです:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // Initialization code 
     theCAEAGLLayer = (CAEAGLLayer*)self.layer; 
     theCAEAGLLayer.opaque = YES; 
     theEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
     [EAGLContext setCurrentContext:theEAGLContext]; 
     glGenFramebuffers(1, &theFramebuffer); 
     glBindFramebuffer(GL_FRAMEBUFFER, theFramebuffer); 
     glGenRenderbuffers(1, &theColorRenderbuffer); 
     glBindRenderbuffer(GL_RENDERBUFFER, theColorRenderbuffer); 
     [theEAGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:theCAEAGLLayer]; 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, theColorRenderbuffer); 
     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &widthOfTheColorRenderbuffer); 
     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &heightOfTheColorRenderbuffer); 
     glGenRenderbuffers(1, &theDepthRenderbuffer); 
     glBindRenderbuffer(GL_RENDERBUFFER, theDepthRenderbuffer); 
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, widthOfTheColorRenderbuffer, heightOfTheColorRenderbuffer); 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, theDepthRenderbuffer); 
     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
     { 

     } 
    } 
    return self; 
} 

答えて

1

適切な答え:

UIKitは特定の操作をまとめて実行ループの後半まで延期します。これは、ビューのサイズを変更し、ビュー内の異なるビットのテキストを変更するコードがあるためです。おそらく、そのようなものが原子的に起こることを望むでしょう。

これはおそらく、レイヤのサイズがまだ決まっていないことを意味します。あなたは持っているものを移動しようとしました- (void)layoutSubviews

iOS 5のみをターゲットに設定する場合は、GLKViewを使用して、これらのものを自分で書くことは避けてください。

その他のコメント:

glRenderbufferStorageはOpenGLがに描くことができ、不透明な場所での保管を作成するだろうが、どのようにフレームバッファのOSの推測ではなく、単によりも、ユーザーに見せたいものです必要があります中間結果ですか? OpenGL仕様では、特定のOSとの通信方法を明示的に定義していません。 iOSでは、renderbufferStorage:fromDrawable:によって実現されます。これは、iOSがどのように合成するかを知っているCALayerに相当するストレージを追加すると言われています。 Appleの方法はglRenderbufferStorageの代わりではなく、glRenderbufferStorageは不可能でもなくてもかまいません。また、iOS専用のプログラミングをしていても何度でも使用します。

- (id)initWithFrame:は、ビューを手動で作成する場合に使用する初期設定です。 - (id)initWithCoder:は、NIBからビューをロードするためにシステムによって使用されます。

あなたのUIViewはlayerClassを間違いなくCAEAGLLayerと指定しましたか?そうでない場合、EAGLコンテキストへの呼び出しは失敗することが許されます。

+0

ご意見ありがとうございます。私はlayoutSubviewsに移動しようとしましたが、これで解決できませんでした。 layerClassは実際に[CAEAGLLayer class]を返しています。ビューのサイズは「Xcode」に「適合するように」設定されています。レイヤのサイズを変更するにはどうすればよいですか?私はGLKViewとGLKViewControllerで何ができるかを見ていきます。 – Lars

+0

レイヤーは自動的にビューのサイズに合わせる必要がありますので、見ているものは非常に興味があります。チャンスをつかんだときにGLコードを掘り下げて、もっと役に立つものを見つけられるかどうかを見てみましょう。申し訳ありませんが、私はまだここに、これは間違いなく答えのタイプです供給することができていません。 – Tommy

関連する問題