OpenGL ESを使用したiOS用3Dグラフィックス(2)

2011. 12. 06
●EAGLとCoreAnimation

7645  iPhone上でのOpenGL ES
EAGLとCore Animation

・ネイティブウィンドウシステムはCore Animation
・OpenGL ESプラットフォームAPIはEAGL

EAGL(Embedded Apple Graphic Library)

7646  EAGL
iPhone OpenGL ESプラットフォームAPI

・OpenGL ESとiPhone OS間のインターフェイスを定義
・OpenGL ESレンダリングコンテキストを管理
・OpenGL ESのコンテキストをレンダリングして表示するため
 Core Animationと連携
・描画可能な構成にするためOES_framebuffer_object拡張機能を利用

7647
 
  EAGL
EAGLコンテキスト

・現在のOpenGL ESの状態とコマンドストリームを含む
・スレッドごとに一つの現在のEAGLコンテキスト
 ・注:OpenGL ESはスレッドセーフではありません
・全てのOpenGL ESコマンドは現在のEAGLコンテキストに発行される

7648  EAGL
EAGLコンテキストの設定

/* EAGLコンテキストの割り当てと初期化 */
EAGLContext* myCtx =
[[EAGLContext alloc]
initWithAPI: kEAGLRenderingAPIOpenGLES1];

/* スレッドの現在のコンテキストとして設定 */

[EAGLContext setCurrentContext:myCxt];

/* これでOpenGL ESコマンドを発行することができる */

const char* myRenderer = glGetString(GL_RENDERER);

しかしレンダリングはどこで行うのか?

7649  EAGL
フレームバッファオブジェクト(FBO)

・iPhone OS上のOpenGL ESでは全てのレンダリングにFBOが使用される
 ・オフスクリーンと表示可能なコンテンツのため
・APIはOES_framebuffer_object拡張機能によって定義される
・FBOはテクスチャとレンダバッファ内に格納される、色、深度、
 ステンシルバッファへの参照が含まれる

7650  OES_framebuffer_object
OpenGL ESでのFBOの使用

glGenFramebuffersOES
glBindFramebufferOES
コンテキストに新しいフレームバッファオブジェクトの割り当てと
バインド

glFramebufferRenderbufferOES
フレームバッファオブジェクトに画像をアタッチ

glGenRenderbuffersOES
glBindRenderbufferOES
glRenderbufferStorageOES
色と深度バッファのストレージを割り当て

・OpenGL ESフレームバッファ
 ・色アタッチメント
   → OpenGL ESレンダバッファ(色)
 ・深度アタッチメント
   → OpenGL ESレンダバッファ(深度)

・OpenGL ESフレームバッファには、状態と色、深度、ステンシル
 バッファへの参照が含まれます

・OpenGL ESレンダバッファには、それぞれ色、深度、ステンシル
 のピクセル値が含まれます

7651  OES_framebuffer_object
FBOの設定

/* FBOとレンダバッファの名前を生成 */
glGenFramebuffersOES(1, &myFBO);
glGenRenderbuffersOES(1, &myRb);

/* コンテキストにFBOをバインド */

glBindFramebufferOES(GL_FRAMEBUFFER_OES, myFBO);

/* コンテキストにレンダバッファをバインド */

glBindRenderbufferOES(GL_RENDERBUFFER_OES, myRb);

/* レンダバッファ用のストレージを割り当て */

glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
 format, w, h);

/* FBOの色アタッチメントポイントにレンダバッファを
アタッチ */

glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,
 GL_COLOR_ATTACHMENT0_OES,
 GL_RENDERBUFFER_OES, myRb)

これで描画することができます!

7652  EAGLとフレームバッファオブジェクト
まとめ

・OpenGL ESコンテキストの生成にはEAGLを使用
・OpenGL ESフレームバッファの設定にはOES_framebuffer_object API
 を使用

OpenGL ESコンテキストを表示するにはどうするか?

7653  CAEAGLLayer
CAEAGLLayerの紹介

・CAEAGLLayerは、OpenGL ESコンテンツを表示することができる、
 Core Animationレイヤのサブクラス
・OpenGL ESとCore Animation APIを統合
・OpenGL ESレンダバッファにアタッチすることができる

7654
 
  CAEAGLLayer
CAEAGLLayerの使い方

1. レンダリングされたコンテンツを表示するため、
 UIViewをサブクラス化

2. CALayerの代わりにCAEAGLLayerクラスを返す
 ように、UIViewの[layerClass]メソッドをオーバーライド
UIKit
3. OpenGL ESのレンダバッファとFBOを生成、バインドOpenGL ES
4. レンダバッファにCAEAGLLayerをアタッチEAGL
5. OpenGL ESを使用してレンダバッファにレンダリングOpenGL ES
6. ディスプレイにレンダバッファのコンテンツを表示EAGL

7655  CAEAGLLayer
CAEAGLLayerにOpenGL ESのレンダバッファをアタッチ

glBindRenderbufferOES
コンテキストにレンダバッファをバインド

EAGLコンテキスト
    ↓ 現在バインドされているレンダバッファ
OpenGL ESレンダバッファ(色)

7656  CAEAGLLayer
CAEAGLLayerにOpenGL ESのレンダバッファをアタッチ

glRenderbufferStorageOES
レンダリング可能なストレージの割り当て

EAGLコンテキスト
    ↓ 現在バインドされているレンダバッファ
OpenGL ESレンダバッファ(色)
    ↓ 内部割り当て
レンダリング可能なストレージ

7657  CAEAGLLayer
CAEAGLLayerにOpenGL ESのレンダバッファをアタッチ

[EAGLContext renderbufferStorage:fromDrawable:]
レンダリングと表示が可能なストレージの割り当て
CAEAGLLayerにOpenGL ESレンダバッファをアタッチ

EAGLコンテキスト
    ↓ 現在バインドされているレンダバッファ
OpenGL ESレンダバッファ(色)
    ↓ アタッチされた描画可能オブジェクト
 CAEAGLLayer

7659  CAEAGLLayer
CAEAGLLayerにOpenGL ESのレンダバッファをアタッチ

[EAGLContext presentRenderbuffer:]
ディスプレイに現在バインドされているレンダバッファを表示

EAGLコンテキスト
    ↓ 現在バインドされているレンダバッファ
OpenGL ESレンダバッファ(色)
    ↓ アタッチされた描画可能オブジェクト
 CAEAGLLayer ← Core AnimationのCALayerから継承

7660  CAEAGLLayer
表示可能なレンダバッファにレンダリング

EAGLコンテキスト
↓ 現在バインドされて
↓ いるレンダバッファ
OpenGL ESフレームバッファ
色アタッチメント  深度アタッチメント
OpenGL ES
レンダバッファ
(色)
OpenGL ES
レンダバッファ
(深度)

7661  CAEAGLLayer
描画可能プロパティ

kEAGLDrawablePropertyColorFormat
 ・カラーバッファのフォーマットの設定
  ・kEAGLColorFormatRGB565
  ✓ kEAGLColorFormatRGBA8
 ・最適なパフォーマンスを得るために
  kEAGLColorFormatRGB565に設定
kEAGLDrawablePropertyRetainedBacking
 ・コンテンツが表示された後に保存されているかを定義
  ・YES
  ✓ NO
 ・最適なパフォーマンスを得るためにNOに設定

✓ = デフォルト

7662  OpenGL ESオブジェクトの共有
EAGLシェアグループ

・複数のコンテキストでオブジェクトを共有することができる
 ・テクスチャ、レンダバッファ、頂点バッファ、FBO
・共有するため、コンテキストは同じシェアグループで初期化する必要
 がある
 ・シェアグループは既存のコンテキストから照会することができる
 ・シェアグループが指定されていない場合、新しいシェアグループ
  が自動的に生成される

7667  実装の詳細
iPhone GPU

・イマジネーションテクノロジーズ PowerVR MBX-Lite
 ・ハードウェアアクセラレーションされたOpenGL ES 1.1をサポート
 ・組込みシステム向けの設計
 ・タイルベースの遅延レンダリング(TBDR)を実装
 ・隠面消去(HSR)を使用

7668  実装の詳細
タイルベースの遅延レンダリング(TBDR)とは?

・各ポリゴンを順番に処理するレンダラとは異なり...
・タイルベースの遅延レンダリング
 ・レンダリングの前にフレーム全体分のデータを格納
 ・画面の空間に基づいて、データセットをタイルに分割
 ・各タイル用にレンダリングコマンドのリストを生成
 ・各タイルの処理
  1. タイルの可視ピクセルを決定
  2. 可視ピクセルのみを処理
  3. タイルの最終的なピクセル値をメモリに書き込み

7669  実装の詳細
何故アプリケーションにおいてTBDRが重要か

・TBDRはより効率的にメモリを使用する
 ・GPUは可視テクセルのみを読み込む
 ・GPUは最終的なピクセルのみを書き込む
・ただし...
 ・事前のレンダリング完了に依存した操作は高くつく
 ・例:以下のような操作は注意深くスケジュール
  ・glReadPixels
  ・glTexSubImage
  ・glBindFramebufferOES
  ・など...

7670  実装の詳細
その他のOpenGL ESの制限

・サポートされるフレームバッファの構成
 ・色:16または32ビット/ピクセル
 ・深度:24ビット/ピクセル
 ・ステンシル:サポートされていません
・2つのテクスチャユニット
 ・最大テクスチャと描画可能サイズは1024 x 1024
 ・テクスチャサイズは『2のべき乗』である必要がある
・8つの光源をサポート
・1つのクリップ面をサポート


●iPhone simulator上でのOpenGL

7671  iPhoneシミュレータ上でのOpenGL ES

・iPhoneシミュレータ上では完全なOpenGL ES 1.1を実装
・デバイスとの比較
 ・機能はほぼ完全にシミュレート
 ・パフォーマンスはかなり異なる
 ・実験のため工程時間がより速い
・忠告
 ・シミュレータは簡単なテストや機能追加に使用する
 ・主な開発や全てのパフォーマンス調整にはデバイスを使用する

7672  iPhoneシミュレータ上でのOpenGL ES
注意事項

・現在シミュレータでサポートされていない、いくつかの拡張機能
 ・GL_OES_draw_texture
 ・GL_OES_matrix_palette
 ・GL_EXT_texture_filter_anisotropic
・現在シミュレータで適用されていないもの
 ・いくつかのOpenGL ESでのエラーの発生
 ・iPhoneデバイスのリソース制限
  (メモリ、スケジューリング、帯域幅など)



参考文献

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

Khronos OpenGL ES API Registry






Bose SoundLink around-ear wireless headphones II
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
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 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

Bose SoundLink around-ear wireless headphones II
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