GLFun(6)~OpenGLES2DViewクラス(2)

2011. 12. 17
2)createFramebufferメソッド

createFramebufferメソッドは、フレームバッファオブジェクトとレンダバッファの生成とコンテキストへのバインド、フレームバッファオブジェクトの完全性のテストを行っています。
(『iOS OpenGL ESプログラミングガイド』のp.34『オフスクリーンフレームバッファオブジェクトの作成』と、p.35『Core Animationレイヤへのレンダリング』の『7』と『8』を参照)

ここで使用されているOpenGL ESの関数には全て『OES』という接尾辞が付いています。
OESは『OpenGL extension specification』の略でKhronosによって拡張された機能を意味します。
(『OpenGL ESを使用したiOS用3Dグラフィックス(1)』参照)

OpenGL ES 1.1の拡張機能は『OpenGL ES 1.1 Reference Pages』に載っていないため、以降の関数の説明では接尾辞の無い(『OpenGL ES 2.0 Reference Pages』に載っている)OpenGL ES 2.0の関数で説明します。

したがって、文中では関数や定数の説明の際に接尾辞OESを省略することになりますので、留意してください。


フレームバッファの作成とバインド)

フレームバッファを生成し、レンダリングコンテキストに接続します。

最初にglGenFramebuffersでフレームバッファの生成を行います。

第一引数は要求する個数を、第二引数はフレームバッファを識別する名前を指定します。
(『テン*シー*シー/iPhoneアプリ開発、その(100) ようやく終息OpenGL ESセットアップ』参照)

(実装しているコードでは次の行ですが)その後、後述するinitWithCoder:メソッドで初期化するレンダリングコンテキストに対してglBindFramebufferで名付けたフレームバッファをバインドします。

第一引数のターゲットは必ずGL_FRAMEBUFFERであり、第二引数は直前に生成したフレームバッファの識別名を指定します。

glGenFramebuffers

void glGenFramebuffers(GLsizei n, GLuint * framebuffers);

フレームバッファオブジェクト名を生成します。

glGenFramebuffersは、framebuffersで名付けたn個のフレームバッファオブジェクトを返します。

名前の形式は連続した整数のセットを保証するものではありませんが、返される名前のどれもglGenFramebuffersの呼び出しの直前に使用されていなかったことを保証します。

glGenFramebuffersの呼び出しによって返されるフレームバッファオブジェクト名は、glDeleteFramebuffersで最初に削除されない限り、後続の呼び出しによって返されません。

glBindFramebufferを呼び出すことによって最初にバインドされるまで、返されたフレームバッファオブジェクト名はフレームバッファオブジェクトに関連付けられません。

nが負の場合、GL_INVALID_VALUEが発生します。

n:生成されるフレームバッファオブジェクト名の数を指定します。

framebuffers:生成されたフレームバッファオブジェクト名が格納される配列を指定します。

glBindFramebuffer

void glBindFramebuffer(GLenum target, GLuint framebuffer);

名付けられたフレームバッファオブジェクトをバインドします。

glBindFramebufferは名付けられたフレームバッファオブジェクトを生成または使用することができます。

targetにGL_FRAMEBUFFERを、framebufferに新しいフレームバッファオブジェクトの名前を設定してglBindFramebufferを呼び出すと、フレームバッファオブジェクト名にバインドします。

フレームバッファオブジェクトがバインドされている時、以前のバインドは自動的に破棄されます。

フレームバッファオブジェクト名は符号無し整数です。

値ゼロは、ウィンドウシステムによって提供されるデフォルトのフレームバッファを表すために予約されています。

フレームバッファオブジェクト名と対応するフレームバッファオブジェクトのコンテンツは、現在のGLレンダリングコンテキストの共有オブジェクト空間に対してローカルです。

新しいフレームバッファオブジェクト名の設定には、glGenFramebuffersを使用することができます。

最初にバインドした直後のフレームバッファオブジェクトの状態には、オブジェクト型としてそれぞれGL_NONEの3つのアタッチメントポイント(GL_COLOR_ATTACHMENT0、GL_DEPTH_ATTACHMENT、そしてGL_STENCIL_ATTACHMENT)があります。

非ゼロのフレームバッファオブジェクト名がバインドされている間、ターゲットGL_FRAMEBUFFER上のGL操作はバインドされているフレームバッファオブジェクトに影響を及ぼし、ターゲットGL_FRAMEBUFFERまたはフレームバッファのクエリは、バインドされたフレームバッファオブジェクトからGL_DEPTH_BITSなどの状態を返します。

ゼロのフレームバッファオブジェクト名がバインドされている間は、初期状態におけるように、ターゲットGL_FRAMEBUFFER上で状態を変更または照会を試みると、GL_INVALID_OPERATIONエラーが発生します。

非ゼロのフレームバッファオブジェクト名がバインドされている間、全ての(glDrawArraysやglDrawElementsによる)フレームバッファへのレンダリングと、(glReadPixels、glCopyTexImage2D、またはglCopyTexSubImage2Dによる)フレームバッファからの読み込みには、デフォルトのウィンドウシステムが提供したフレームバッファではなく、アプリケーションが生成したフレームバッファオブジェクトにアタッチされた画像を使用してください。

アプリケーションで生成されるフレームバッファオブジェクト(即ち非ゼロの名前)は、デフォルトのウィンドウシステムが提供するフレームバッファとはいくつか異なる点が有ります。

第一に、フレームバッファでアタッチ可能な画像をアタッチやデタッチするため、カラーバッファや深度バッファ、ステンシルバッファに対して変更可能なアタッチメントポイントを持っています。

第二に、アタッチされた画像のサイズやフォーマットは完全にGLの制御されており、ピクセルフォーマットの選択やウィンドウのリサイズ、ディスプレイモードの変更といったウィンドウシステムのイベントによる影響を受けません。

第三に、アプリケーションが生成したフレームバッファオブジェクトへのレンダリング、あるいはオブジェクトからの読み込み時は、ピクセル所有権テストは常に成功します(即ち、オブジェクトが全てのピクセルを所有しています)。

第四に、フレームバッファオブジェクトは不可視のカラーバッファビットプレーンで、唯一の『オフスクリーン』カラーイメージアタッチメントであり、フロント/バックバッファやスワッピングの概念はありません。

最後に、フレームバッファオブジェクトにはマルチサンプルバッファが無く、実装依存の状態変数GL_SAMPLESやGL_SAMPLE_BUFFERSは、アプリケーションが生成するフレームバッファオブジェクトの場合には両方ともゼロになります。

glBindFramebufferで生成されたフレームバッファオブジェクトのバインディングは、異なるフレームバッファオブジェクト名がバインドされるまで、あるいはglDeleteFramebuffersでフレームバッファオブジェクトが削除されるまで、アクティブが持続します。

実装依存のピクセルの深さと関連する状態のクエリは、現在バインドされているフレームバッファオブジェクトから派生しています。

これらには、GL_RED_BITS、GL_GREEN_BITS、GL_BLUE_BITS、GL_ALPHA_BITS、GL_DEPTH_BITS、GL_STENCIL_BITS、GL_IMPLEMENTATION_COLOR_READ_TYPE、GL_IMPLEMENTATION_COLOR_READ_FORMAT、GL_SAMPLES、そしてGL_SAMPLE_BUFFERSが含まれています。

targetがGL_FRAMEBUFFERでない場合は、GL_INVALID_ENUMが発生します。

target:フレームバッファオブジェクトをバインドするターゲットを指定します。
シンボリック定数はGL_FRAMEBUFFERである必要があります。

framebuffer:フレームバッファオブジェクトの名前を指定します。


色レンダバッファの作成とストレージの割り当て、そしてフレームバッファの色アタッチメントポイントへのストレージのアタッチ)

レンダバッファを生成してレンダリングコンテキストに接続し、レンダバッファの内容を保持するストレージを割り当て、その内容をフレームバッファの色アタッチメントポイントに接続します。

まず、glGenRenderbuffersでレンダバッファの生成を行います。

フレームバッファと同様に第一引数は要求する個数を、第二引数はレンダバッファの識別名を指定します。

レンダリングコンテキストへのバインドはglBindRenderbufferで行います。

こちらもフレームバッファと同様で、第一引数のターゲットは必ずGL_RENDERBUFFERであり、第二引数には生成したレンダバッファの識別名を指定します。

レンダバッファへのストレージの割り当ては、オフスクリーンへのレンダリングの場合はglRenderbufferStorageを使用しますが、Core Animationレイヤ(CAEAGLLayer)へレンダリングする場合はrenderbufferStorage:fromDrawable:メソッドを使用します。

レンダリングコンテキストを対象に、第一引数はこちらも必ずGL_RENDERBUFFERにします。

第二引数はEAGLDrawableプロトコルに準拠したしたオブジェクト、つまりCAEAGLLayerオブジェクトであるビューのレイヤを渡すのですが、UIViewlayerプロパティが返すレイヤのクラスがCALayerのため、CAEAGLLayerにキャスト(型変換)する必要があります。

そしてglFramebufferRenderbufferでフレームバッファにレンダバッファをアタッチします。

第一引数は必ずGL_FRAMEBUFFERになります。

第二引数はフレームバッファの3つのアタッチメントポイントの1つを指定するのですが、必須となる色アタッチメントポイントであるGL_COLOR_ATTACHMENT0を指定します。
(深度やステンシルを利用する場合は、GL_DEPTH_ATTACHEMENTまたはGL_STENCIL_ATTACHMENTを指定することになります)

第三引数は必ずGL_RENDERBUFFERになります。

第四引数はアタッチするレンダバッファの識別名を指定します。

glGenRenderbuffers

void glGenRenderbuffers(GLsizei n, GLuint * renderbuffers); 

レンダバッファオブジェクト名を生成します。

glGenRenderbuffersは、renderbuffersで名付けたn個のレンダバッファオブジェクトを返します。

名前の形式は連続した整数のセットを保証するものではありませんが、返される名前のどれもglGenRenderbuffersの呼び出しの直前に使用されていなかったことを保証します。

glGenRenderbuffersの呼び出しによって返されるレンダバッファオブジェクト名は、glDeleteRenderbuffersで最初に削除されない限り、後続の呼び出しによって返されません。

glBindRenderbufferを呼び出すことによって最初にバインドされるまで、返されたレンダバッファオブジェクト名はレンダバッファオブジェクトに関連付けられません。

nが負の場合、GL_INVALID_VALUEが発生します。

n:生成されるレンダバッファ名の数を指定します。

renderbuffers:生成されたレンダバッファオブジェクト名が格納される配列を指定します。

glBindRenderbuffer

void glBindRenderbuffer(GLenum target, GLuint renderbuffer); 

名付けられたレンダバッファオブジェクトをバインドします。

レンダバッファは、レンダリング可能な内部フォーマットの単一の画像を含む、データストレージオブジェクトです。

レンダバッファの画像は、レンダリングの出力先や読み込みのためのソースとして、フレームバッファオブジェクトへのアタッチに使用することができます。

glBindRenderbufferは名付けられたレンダバッファオブジェクトを生成または使用することができます。

targetにGL_RENDERBUFFERを、renderbufferに新しいレンダバッファオブジェクトの名前を設定してglBindRenderbufferを呼び出すと、レンダバッファオブジェクト名にバインドします。

レンダバッファオブジェクトがバインドされている時、以前のバインドは自動的に破棄されます。

レンダバッファオブジェクト名は符号無し整数です。

値ゼロは予約されていますが、デフォルトのレンダバッファは存在しません。

代わりに、renderbufferをゼロに設定すると、以前にバインドされていたレンダバッファオブジェクトは事実上アンバインドされます。

レンダバッファオブジェクト名と対応するレンダバッファオブジェクトのコンテンツは、現在のGLレンダリングコンテキストの共有オブジェクト空間に対してローカルです。

新しいレンダバッファオブジェクト名の設定には、glGenRenderbuffersを使用することができます。

最初にバインドした直後のレンダバッファオブジェクトの状態は、フォーマットGL_RGBA4で、ゼロサイズのred、green、blue、alpha、depth、そしてステンシルピクセル深度のゼロサイズのメモリバッファです。

非ゼロのレンダバッファオブジェクト名がバインドされている間、ターゲットGL_RENDERBUFFER上のGL操作はバインドされているレンダバッファオブジェクトに影響を及ぼし、ターゲットGL_RENDERBUFFERのクエリは、バインドされたレンダバッファオブジェクトから状態を返します。

ゼロのレンダバッファオブジェクト名がバインドされている間は、初期状態におけるように、ターゲットGL_RENDERBUFFER上で状態を変更または照会を試みると、GL_INVALID_OPERATIONエラーが発生します。

glBindRenderbufferで生成されたフレームバッファオブジェクトのバインディングは、異なるレンダバッファオブジェクト名がバインドされるまで、あるいはglDeleteRenderbuffersでレンダバッファオブジェクトが削除されるまで、アクティブが持続します。

targetがGL_RENDERBUFFERでない場合は、GL_INVALID_ENUMが発生します。

target:レンダバッファオブジェクトをバインドするターゲットを指定します。
シンボリック定数はGL_RENDERBUFFERである必要があります。

renderbuffer:レンダバッファオブジェクトの名前を指定します。

renderbufferStorage:fromDrawable:

- (BOOL)renderbufferStorage:(NSUInteger)target fromDrawable:(id<eagldrawable>)drawable

OpenGL ESのレンダバッファオブジェクトに、描画可能なオブジェクトのストレージをバインドします。

戻り値は成功した場合はYES、それ以外の場合はNOになります。

画面に表示することができるレンダバッファを生成するには、レンダバッファをバインドし、このメソッドを呼び出すことによって共有ストレージを割り当てます。

このメソッドの呼び出しは、通常glRenderbufferStorageへの呼び出しを置換します。

レンダバッファは、このメソッドでストレージを割り当てた後で、presentRenderbuffer:を呼び出して表示することができます。

幅、高さ、内部カラーバッファフォーマットは、描画可能なオブジェクトの特性に由来します。

このメソッドを呼び出す前に、描画可能オブジェクトのdrawableProperties辞書にkEAGLDrawablePropertyColorFormatキーを追加することによって、内部カラーバッファフォーマットをオーバーライドすることができます。

OpenGL ESのレンダバッファが描画可能オブジェクトからデタッチする必要がある場合は、drawableをnilに設定してこのメソッドを呼び出すことができます。

target:現在バインドされているレンダバッファ用の、OpenGL ESのバインディングポイントを指定します。
OpenGL ES 1.0 APIを使用するコンテキストの場合は、GL_RENDERBUFFER_OESにする必要があります。
OpenGL ES 2.0 APIを使用するコンテキストの場合は、OES接尾辞を削除する必要があります。

drawable:EAGLDrawableプロトコルに準拠したオブジェクトで、レンダバッファにバインドするストレージを指定します。
iOS 3.0の場合は常にCAEAGLLayerオブジェクトです。

layer

@property(nonatomic, readonly, retain) CALayer *layer

レンダリングに使用する、ビューのCore Animationレイヤです。(読み込み専用)

このプロパティはnilになることはありません。

オブジェクトの実際のクラスは、layerClassメソッドによって返される値によって決定されます。

ビューはレイヤのデリゲートです。

警告:ビューはレイヤのデリゲートであるため、ビューを他のCALayerオブジェクトのデリゲートにしないでください。
更に、このレイヤオブジェクトのデリゲートを変更しないでください。

glFramebufferRenderbuffer

void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);

フレームバッファオブジェクトにレンダバッファオブジェクトをアタッチします。

glFramebufferRenderbufferは、現在バインドされているフレームバッファオブジェクトの論理バッファの一つとして、renderbufferによって指定されたレンダバッファにアタッチします。

attachmentは、フレームバッファオブジェクトのカラー、深度、またはステンシルバッファのどれにアタッチするかを指定します。

レンダバッファは、デフォルトのフレームバッファオブジェクト名0にアタッチされていない可能性があります。

renderbufferが0でない場合、アタッチメントポイントに指定されたGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPEの値はGL_RENDERBUFFERに設定され、GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAMEの値はrenderbufferに設定されます。

GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVELとGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACEは、デフォルト値がそれぞれ0とGL_TEXTURE_CUBE_MAP_POSITIVE_Xに設定されています。

現在バインドされているフレームバッファオブジェクトのattachment論理バッファへの以前のアタッチメントは破棄されます。

renderbufferが0の場合、現在バインドされているフレームバッファオブジェクトattachment論理バッファへアタッチされている画像があればデタッチされます。

GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPEの値はGL_NONEに設定されています。

GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAMEの値は0に設定されています。

GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVELとGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACEは、デフォルト値がそれぞれ0とGL_TEXTURE_CUBE_MAP_POSITIVE_Xに設定されています。

現在バインドされているフレームバッファへ画像がアタッチされている間にレンダバッファオブジェクトが削除された場合、現在バインドされているフレームバッファオブジェクトにアタッチされた画像へのアタッチメントポイントは、0のrenderbufferでglFramebufferRenderbufferを呼び出したようになります。

言い換えると、レンダバッファの画像は現在バインドされているフレームバッファからデタッチされます。

レンダバッファの画像は、バインドされていないフレームバッファから明確にデタッチされないことに注意してください。

バインドされていないフレームバッファからの画像のデタッチは、アプリケーションの責任です。

targetがGL_FRAMEBUFFERでない場合、GL_INVALID_ENUMが発生します。

renderbuffertargetがGL_RENDERBUFFERではなく、renderbufferが0ではない場合、GL_INVALID_ENUMが発生します。

attachmentがアタッチメントポイントに受け付けられなかった場合GL_INVALID_ENUMが発生します。

デフォルトのフレームバッファオブジェクト名0がバインドされている場合、GL_INVALID_OPERATIONが発生します。

renderbufferが0でも現在のレンダバッファオブジェクト名でもない場合、GL_INVALID_OPERATIONが発生します。

target:フレームバッファのターゲットを指定します。
シンボリック定数はGL_FRAMEBUFFERである必要があります。

attachment:アタッチする必要があるレンダバッファのアタッチメントポイントを指定します。
シンボリック定数は、GL_COLOR_ATTACHIMENT0、GL_DEPTH_ATTACHMENT、またはGL_STENCIL_ATTACHMENTの内の一つにする必要があります。

renderbuffertarget:レンダバッファのターゲットを指定します。
シンボリック定数はGL_RENDERBUFFERである必要があります。

renderbuffer:アタッチするレンダバッファオブジェクトを指定します。



参考文献

iOS OpenGL ESプログラミングガイド

UIView Class Reference

EAGLContext Class Reference

OpenGL ES 2.0 Reference Pages

テン*シー*シー/iPhoneアプリ開発、その(100) ようやく終息OpenGL ESセットアップ

WisdomSoft/OpenGL入門/テクスチャ

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
10 | 2017/11 | 12
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR