OpenGL ES --FrameBuffer

5832 ワード


 
OpenGL ES --FrameBuffer
 
FrameBufferオブジェクトはレンダリングの結果を保存するために使用され、FrameBufferは色、モデル、色の深さなどを正確に作成することができます.
次に、FrameBufferを作成する方法を示します.
1:framebufferオブジェクトを作成します.
2:1つ以上のオブジェクト(renderbuffers or textures)を作成し、framebufferの着付けポイントに格納して割り当てます.
3:framebufferの整合性をテストします.
 
次はSample Code
 

OfferScreen Framebufferオブジェクトの生成


 
1:framebufferを生成してバインドする
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

2:生成
colorRenderbuffer
あ、メモリを割り当ててframebufferに払います.
GLuint colorRenderbuffer;
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

3:depthRenderbufferを生成し、メモリを割り当ててframebufferに付けます.
GLuint depthRenderbuffer;
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

4 framebufferの整合性を確認し、frameプロパティが編集された後に呼び出す必要があります.
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"failed to make complete framebuffer object %x", status);
}

framebufferによるテクスチャレンダリング:
1:framebufferオブジェクトを作成します.
2:目的のテクスチャを作成し、framebufferにアタッチします.
// create the texture
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

3:depthRenderbufferを生成し、メモリを割り当ててframebufferに付けます.(同上)
4:framebufferの整合性を確認します.(同上)
 
 

レンダリングCore Animation Layer:


iOSではCore Animation Layerで表示されていますが、OpenGL ESでは直接使用されていません
CAEAGLLayer
UIViewのサブクラスを定義し、UIViewはCAEAGLLayerによってサポートされます.
.
次はOpenGL ESを生成するViewステップです.
1:UIViewのサブクラスを生成して
OpenGL ESのView;
2:書き換え(override)
layerClass
あなたのビューを使用する方法CAEAGLLayerはその下層として機能する.layerClassは1つを返します
CAEAGLLayer.
   
+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

 
3:Viewの初期化中に、viewのlayerプロパティを読み込みます.コードは次のとおりです.
 myEAGLLayer = (CAEAGLLayer*)self.layer;
4:layerのプロパティを設定します.
最良の効果のために、opaque=yesとする.不透明にする.
5:Contextを割り当ててcurrentContextに設定します.
6:FrameBufferを生成する(詳細は後述)
7:ContextのrenderbufferStorage:fromDrawable: 。 sampleCode:を呼び出すことによってcolor renderbufferを生成する
GLuint colorRenderbuffer;
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[myContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:myEAGLLayer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
: Layer , reallocate renderbuffer、そうでないと表示サイズと競合します.
8:読み取りrenderbufferの高さと幅.
GLint width;
GLint height;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);

9:depth bufferを生成し、添付する.
10:framebufferをテストします.
Framebufferを描画するには:
FrameBufferを描くには2つの方法があります.1:必要に応じて描く2:アニメーションサイクルで描く.
需要に応じて描画:頻繁に変化しない、またはユーザーが入力している場合に対応する変化を行う状況に適しています.
注意:OpenGL ESviewはDrawRectメソッドではなく、独自のメソッドを構築して描画する必要があります.データが変化したり、描画が必要になったりしたときに自分のメソッドを呼び出します.
これは、drwaRectのメソッド実行時にUImitが影響を受けることを防止するためである.
描画ループで描画:データが頻繁に変化する場合は、この描画方法を使用します.例えばゲームや、ダイナミックな効果が厳しく、円滑なアニメーションが必要な場合.
iOSでは、あなたの描画方法とCADisplayLinkオブジェクトを一緒に設定するのが最善です.このオブジェクトは、描画頻度と画面のリフレッシュレートを同期させることができます.次に、CADisplayLinkのSampleCodeを作成します.
displayLink = [myView.window.screen displayLinkWithTarget:self selector:@selector(drawFrame)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

あなたのdrawFrameメソッドでは.displaylinkのtimestampプロパティを読み込んでください.次のdrawframeの時刻を知るために使用されます.次に表示するデータを計算するために使用します.
ほとんどの場合、displaylinkの起動周波数は60 Hz程度で、ハードウェア環境によって変化します.しかし、アニメーションはこのような高速リフレッシュ周波数(映画24 Hz)は必要ありません.
ディスプレイリンクのframeIntervalプロパティを設定して、画面をリフレッシュするたびに描画することを決定することができます.frameIntervalを入れるのが3なら20 hzくらいの描画頻度です.