GLFun(7)~OpenGLES2DViewクラス(3)

2011. 12. 20
色レンダバッファの高さと幅を取得)

レンダバッファからビューの高さと幅を取得し、後述するinitWithCoder:でビューポートのサイズ設定に使用します。

レンダバッファのパラメータの取得にはglGetRenderbufferParameterivを使用します。

第一引数のターゲットは必ずGL_RENDERBUFFERになります。

第二引数にはレンダバッファから取得する情報を示す定数で、幅はGL_RENDERBUFFER_WIDTH、高さはGL_RENDERBUFFER_HEIGHTを指定します。

第三引数には取得した情報を格納する変数を指定します。

glGetRenderbufferParameteriv

void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint * params);

レンダバッファオブジェクトのパラメータを返します。

glGetRenderbufferParameterivは、現在バインドされているレンダバッファオブジェクトのparamsで選択されたパラメータを返します。

pname名はレンダバッファオブジェクトのパラメータを指定するもので以下のようになっています。

GL_RENDERBUFFER_WIDTH
paramsは現在バインドされているレンダバッファの画像の幅をピクセル単位で返します。
初期値は0です。

GL_RENDERBUFFER_HEIGHT
paramsは現在バインドされているレンダバッファの画像の高さをピクセル単位で返します。
初期値は0です。

GL_RENDERBUFFER_INTERNAL_FORMAT
paramsは現在バインドされているレンダバッファの画像の内部フォーマットを返します。
初期値はGL_RGBA4です。

GL_RENDERBUFFER_RED_SIZE
paramsは現在バインドされているレンダバッファの画像の赤成分のビットの解像度を返します。
初期値は0です。

GL_RENDERBUFFER_GREEN_SIZE
paramsは現在バインドされているレンダバッファの画像の緑成分のビットの解像度を返します。
初期値は0です。

GL_RENDERBUFFER_BLUE_SIZE
paramsは現在バインドされているレンダバッファの画像の青成分のビットの解像度を返します。
初期値は0です。

GL_RENDERBUFFER_ALPHA_SIZE

paramsは現在バインドされているレンダバッファの画像のアルファ成分のビットの解像度を返します。
初期値は0です。

GL_RENDERBUFFER_DEPTH_SIZE
paramsは現在バインドされているレンダバッファの画像の深度成分のビットの解像度を返します。
初期値は0です。

GL_RENDERBUFFER_STENCIL_SIZE
paramsは現在バインドされているレンダバッファの画像のステンシル成分のビットの解像度を返します。
初期値は0です。

glGetRenderbufferParameterivによって報告される成分の解像度は、格納されている成分の実際の解像度で、glRenderbufferStorageのinternalformatパラメータが要求するものと異なる場合があります。

エラーが発生した場合、paramsの内容への変更は行われません。

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

pnameがGL_RENDERBUFFER_WIDTH、GL_RENDERBUFFER_HEIGHT、GL_RENDERBUFFER_INTERNAL_FORMAT、GL_RENDERBUFFER_RED_SIZE、GL_RENDERBUFFER_GREEN_SIZE、GL_RENDERBUFFER_BLUE_SIZE、GL_RENDERBUFFER_ALPHA_SIZE、GL_RENDERBUFFER_DEPTH_SIZE、またはGL_RENDERBUFFER_STENCIL_SIZEでない場合、GL_INVALID_ENUMが発生します。

予約済のレンダバッファオブジェクト名0がバインドされていた場合、GL_INVALID_OPERATIONが発生します。

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

pname:レンダバッファオブジェクトのパラメータのシンボリック名を指定します。
指定可能な値は、GL_RENDERBUFFER_WIDTH、GL_RENDERBUFFER_HEIGHT、GL_RENDERBUFFER_INTERNAL_FORMAT、GL_RENDERBUFFER_RED_SIZE、GL_RENDERBUFFER_GREEN_SIZE、GL_RENDERBUFFER_BLUE_SIZE、GL_RENDERBUFFER_ALPHA_SIZE、GL_RENDERBUFFER_DEPTH_SIZE、GL_RENDERBUFFER_STENCIL_SIZEです。

params:要求されたパラメータを返します。


フレームバッファオブジェクトの完全性のテスト)

生成・バインドされたフレームバッファオブジェクトに問題が無いかどうかを確認するため、完全性のテストを行います。

完全性のテストはglCheckFramebufferStatusで行い、引数には必ずGL_FRAMEBUFFERを指定します。

問題が無い場合はGL_FRAMEBUFFER_COMPLETEが返され、問題が発生した場合はその問題に応じた定数が返され、NSLogに出力されます。

glCheckFramebufferStatus

GLenum glCheckFramebufferStatus(GLenum target);

フレームバッファオブジェクトのフレームバッファ完全性ステータスを返します。

glCheckFramebufferStatusは、現在バインドされているフレームバッファが完全であるかどうかを識別するシンボリック定数を返し、そうでない場合はフレームバッファの完全性の規則に違反していることになります。

フレームバッファが完全である場合は、GL_FRAMEBUFFER_COMPLETEが返されます。

フレームバッファが完全でない場合は、以下の値が返されます。

GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
全てのフレームバッファのアタッチメントポイントが、フレームバッファのアタッチメントとして完全ではありません。
これは、アタッチされたレンダバッファやテクスチャの少なくとも一つのアタッチメントポイントで、アタッチされたオブジェクトがもはや存在していない、あるいはゼロの幅または高さのアタッチされた画像を持つ、あるいはカラーアタッチメントポイントがカラーレンダリング不可能な画像にアタッチされている、あるいは深度アタッチメントポイントが深度レンダリング不可能な画像にアタッチされている、あるいはステンシルアタッチメントポイントがステンシルレンダリング不可能な画像にアタッチされていることを意味します。
カラーレンダリング可能なフォーマットには、GL_RGBA4、GL_RGB5_A1、そしてGL_RGB565が含まれています。
深度レンダリング可能なフォーマットはGL_DEPTH_COMPONENT16のみです。
ステンシルレンダリング可能なフォーマットはGL_STENCIL_INDEX8のみです。

GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
全てのアタッチされた画像が、同じ幅と高さを持っていません。

GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
フレームバッファにアタッチされた画像がありません。

GL_FRAMEBUFFER_UNSUPPORTED
アタッチされた画像の内部フォーマットの組み合わせが、制約の実装依存の設定に違反しています。

現在バインドされているフレームバッファが完全なフレームバッファでない場合、読み書きにフレームバッファを使用しようと試みるとエラーになります。

これはフレームバッファが完全なフレームバッファでない時に呼び出された場合に、レンダリングコマンド(glDrawArraysとglDrawElements)がフレームバッファの読み込みコマンド(glReadPixels、glCopyTexImage2D、そしてglCopyTexSubImage2D)と同様に、GL_INVALID_FRAMEBUFFER_OPERATIONエラーを発生させることを意味します。

必須ではありませんが、アプリケーションがglCheckFramebufferStatusを呼び出して、レンダリングする前にフレームバッファが完全かどうかを確認することを強く推奨します。

なぜなら、いくつかの実装は内部フォーマットの特定の組み合わせへのレンダリングがサポートされていない可能性があるためです。

この場合、GL_FRAMEBUFFER_UNSUPPORTEDが返されます。

デフォルトのウィンドウシステムが提供するフレームバッファは常に完全なフレームバッファであるため、GL_FRAMEBUFFER_BINDINGが0の時にGL_FRAMEBUFFER_COMPLETEが返されます。

エラーが発生した場合、paramsの内容は変更されません。

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

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

createFramebufferメソッドの戻り値)

createFramebufferメソッドは、ビューの初期化を行うinitWithCoder:メソッドから呼び出され、フレームバッファが正常に生成されたかどうかをブール値で返します。

initWithCoder:側では生成の可否を受けて、ビューの初期化を中断するかどうかを判別します。


3)initWithCoder:メソッド

initWithCoder:メソッドでは、nibファイル(GLFunプロジェクトではGLFunViewController.xibファイル)からビューのインスタンスを読み込み、追加の初期化を行います。

まず、スーパークラスによる初期化後、ビューの(CAEAGLLayer)レイヤを読み込んでプロパティの設定を行います。

そしてOpenGL ES 1.1のレンダリングコンテキストを生成し、現在のコンテキストに設定、createFramebufferメソッドを呼び出してフレームバッファと色レンダバッファの生成を行います。

その後、ビューポート変換、投影変換、モデルビュー変換の設定を行い、背景色を設定して表示します。
(『iOS OpenGL ESプログラミングガイド』のp.35『Core Animationレイヤへのレンダリング』の『4』を参照)


レイヤの読み込みと初期化)

OpenGL ESコンテンツを表示するCAEAGLLayerクラスのレイヤを読み込み、プロパティの設定を行います。

最初にlayerプロパティでレイヤを取得し、キャストしてCAEAGLLayerオブジェクトのインスタンスを作ります。

パフォーマンスを最適化するため、opaqueプロパティをYESにしてレイヤを不透明にします。

それとdrawablePropertiesプロパティでレンダリングサーフェスのサーフェスプロパティ(レンダリング時におけるコンテンツの保持とカラーフォーマット)を設定します。

drawablePropertiesは辞書形式なので、dictionaryWithObjectsAndKeys:メソッドでキーと値を設定します。

キーには表示後にコンテンツを保持するかを示すkEAGLDrawablePropertyRetainedBackingと、カラーフォーマットを示すkEAGLDrawablePropertyColorFormatの2つがあり、コンテンツは非保持、カラーフォーマットはkEAGLColorFormatRGB565(16ビットRGBフォーマット)に指定しています。

opaque

@property(getter=isOpaque) BOOL opaque

このプロパティは、レイヤが生成するコンテンツに直接影響を与えます。

デフォルトはNOです。

このプロパティは、開発者によって提供された画像に対して直接効果を与えるものではないことに注意してください。

このプロパティは、setNeedsDisplayが呼び出された時にのみ発動して影響を与えるもので、その後displayはdrawInContext:メソッドが描画するためのビットマップを生成します。

その場合、生成されたビットマップがアルファチャンネルを持っているかどうかは、このプロパティの値によって定義されます。

この値はcontentsプロパティでデベロッパによって提供された画像に対して、直接効果は与えません。

drawableProperties

@property(copy) NSDictionary *drawableProperties

描画可能なサーフェスの所望する特性を指定する、値の辞書です。(必須)

drawablePropertiesの辞書は、OpenGL ESのレンダバッファにアタッチされている時に、このオブジェクトによって使用されるプロパティを指定します。

アプリケーションは、EAGLContextメソッドのrenderbufferStorage:fromDrawable:にこのオブジェクトを渡す前に、これらのプロパティを設定する必要があります。

drawablePropertiesの辞書を変更する場合、アプリケーションは新しい値を有効にするために、再度renderbufferStorage:fromDrawable:を呼び出す必要があります。

・描画可能プロパティのキー

EAGL_EXTERN NSString * const kEAGLDrawablePropertyColorFormat;
EAGL_EXTERN NSString * const kEAGLDrawablePropertyRetainedBacking;

drawablePropertiesの辞書内で指定するキーです。

kEAGLDrawablePropertyColorFormat
描画可能サーフェスのための内部カラーバッファフォーマットを指定するキーです。
このキーの値は、特定のカラーバッファフォーマットを指定するNSStringオブジェクトです。
このカラーバッファフォーマットは、レンダバッファ用のストレージの生成に、EAGLContextオブジェクトによって使用されます。
デフォルト値はkEAGLColorFormatRGBA8です。

kEAGLDrawablePropertyRetainedBacking
描画可能サーフェスを表示した後にコンテンツを保持するかを指定するキーです。
このキーの値は、BOOLデータ型を含むNSNumberオブジェクトです。
NOの場合は、コンテンツが表示された後と同じコンテンツであることに依存しません。
YESの場合は、表示後にコンテンツが変更されません。
値をYESに設定した場合、パフォーマンスの低下と追加のメモリを使用する結果を招くため、必要な時のみコンテンツを無変更にすることを推奨します。
デフォルト値はNOです。

・カラーフォーマット

EAGL_EXTERN NSString * const kEAGLColorFormatRGB565;
EAGL_EXTERN NSString * const kEAGLColorFormatRGBA8;

kEAGLColorFormatRGB565
OpenGL ESのGL_RGB565フォーマットに対応する、16ビットRGBフォーマットを指定します。

kEAGLColorFormatRGBA8
OpenGL ESのGL_RGBA8888フォーマットに対応する、32ビットRGBAフォーマットを指定します。

コンテキストの生成と現在のコンテキストへの設定)

レンダリングコンテキストの生成にはinitWithAPI:メソッドを使用します。

引数にはOpenGL ESのバージョンを示す定数を指定しますが、今回の場合はkEAGLRenderingAPIOpenGLES1を指定しているため、このコンテキストはOpenGL ES 1.1に対応することになります。

コンテキストの生成後、コンテキストが生成されたかどうか、そのコンテキストをsetCurrentContext:メソッドで現在のコンテキストに設定できたかどうか、そして前述のcreateFramebufferメソッドでフレームバッファが生成されたかどうかの3つの条件の論理和を取っています。

従って、いずれかの結果が失敗してnilが返された場合はビューを解放してnilを返すことになり、3つの条件全てが成功した場合のみ以降の処理が進むことになります。

initWithAPI:

- (id)initWithAPI:(EAGLRenderingAPI)api

指定したOpenGL ESのレンダリングAPIのバージョンで、新規に割り当てたレンダリングコンテキストを初期化して返します。

戻り値は初期化されたコンテキストオブジェクト、あるいはオブジェクトが生成できなかった場合はnilを返します。

このコンテキストにOpenGL ESのコマンドを発行するには、setCurrentContext:を呼び出すことによって、現在の描画コンテキストを最初に作成する必要があります。

initWithAPI:を呼び出すと新規にEAGLSharegroupオブジェクトを生成し、このコンテキストにアタッチします。

api:目的とするOpenGL ESのレンダリングAPIのバージョンを指定します。
有効な値については『OpenGL ESのバージョン』を参照してください。

OpenGL ESのバージョン

typedef NSUInteger EAGLRenderingAPI;
enum
{
    kEAGLRenderingAPIOpenGLES1 = 1
    kEAGLRenderingAPIOpenGLES2 = 2
};

これらの定数はレンダリングコンテキストが提供するOpenGL ESのバージョンの選択に使用します。

kEAGLRenderingAPIOpenGLES1
コンテキストはOpenGL ES 1.xレンダリングAPIをサポートします。

kEAGLRenderingAPIOpenGLES2
コンテキストはOpenGL ES 2.xレンダリングAPIをサポートします。

setCurrentContext:

+ (BOOL)setCurrentContext:(EAGLContext *)context

指定したコンテキストを呼び出したスレッドの現在のレンダリングコンテキストとして作成します。

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

エラーが発生した場合、現在のスレッドのレンダリングコンテキストは変更されません。

全てのOpenGL ESの呼び出しは、特記の無い限り、現在のコンテキストに完全に呼び出した順を考慮して発行されます。

EAGLは現在の作成されたコンテキストを保持し、以前のコンテキストは解放します。

nilパラメータでこのメソッドを呼び出すと現在のコンテキストは解放し、全ての描画コンテキストにOpenGL ESのアンバインドをさせます。

複数のスレッド上に現在の同じコンテキストを作成することは避けてください。

OpenGL ESはスレッドの安全性を提供しませんが、複数のスレッド上で同じコンテキストを使用する場合は、複数のスレッドから同じコンテキストへの同時アクセスを防ぐために、スレッドを同期させるいくつかの技術を採用する必要があります。

context:現在作成しようとしているレンダリングコンテキストを指定します。



参考文献

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

UIView Class Reference

CALayer Class Reference

EAGLDrawable Protocol Reference

EAGLContext Class Reference

OpenGL ES 2.0 Reference Pages

はじめての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 他

商品詳細を見る






Lifestyle 650 home entertainment system
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

Lifestyle 650 home entertainment system
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