GLFun(5)~OpenGLES2DViewクラス(1)

2011. 12. 14
OpenGLES2DViewクラスは、OpenGL ESを使用した2Dグラフィックスを描画するためのテンプレートとなるクラスです。

実際にはOpenGLES2DViewクラスをサブクラス化し(今回のプロジェクトの場合はGLFunViewクラス)、そこに独自の描画コードを追加する形となります。

なお、このクラスはOpenGL ES 1.1用で、OpenGL ES 2.0には対応していません。

また『はじめてのiPhoneプログラミング』本書ではAppleによって書かれているとありますが、コードを見ると元著者であるJeff LaMarche氏の署名になっており、再利用の帰属もどうなるのか疑問が残ります。
(Texture2DクラスにはAppleの署名が入っています)


●OpenGLES2DViewクラスの概要

OpenGLES2DViewクラスでは、iOS上でOpenGL ES 1.1を使用した2Dグラフィックスを表示するビューを作成するクラスです。

具体的には以下の実装を行っています。

・CAEAGLLayerクラスのレイヤの作成と設定
・EAGLContextクラスのレンダリングコンテキストの作成
・フレームバッファオブジェクトとレンダバッファの生成と初期化
・2Dグラフィックス用のビューポート変換、投影変換、モデルビュー変換の設定
・背景となるビュー全体を指定色で初期化し表示

このクラスをオーバーライドすることで、開発者は目的とする図形の頂点配列の設定と表示のコードを記述するだけで済みます。


●OpenGLES2DView.hヘッダファイル

#import <UIKit/UIKit.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>
#import "Constants.h"

@interface OpenGLES2DView : UIView {

@protected
    EAGLContext *context;
    GLuint viewRenderbuffer, viewFramebuffer;
    GLint backingWidth, backingHeight;
}

@end

7697

1)インポート

OpenGLES2DViewクラスのスーパークラスはUIViewなので最初にUIKitがインポートされています。

そしてOpenGL ESを使用するための5つのヘッダファイルがインポートされています。

EAGL.hはEAGLContextクラス、EAGLDrawable.hはEAGLContextEAGLDrawableクラスの宣言がなされています。

gl.hはOpenGL ESの基本関数、glext.hはOpenGL ESの拡張関数が宣言されています。

ES1フォルダ下のヘッダファイルしかインポートされていないことから、OpenGL ES 1.1にのみ対応することが分かります。

QuartzCore.hはCAEAGLLayerクラスを利用するためにインポートしています。

ナビゲーションバーとツールバーのセグメンテッドコントロール用の定数を定義しているConstants.hもインポートされていますが、このクラスでは使用しないので無くても構いません。
(このことからもApple社が提供しているものではない、またはそこから改造したものだと推察できます)

2)インスタンス変数

インスタンス変数の宣言は『@protected』というコンパイラ指示子が使われています。

これは変数のアクセス範囲を決定する物で、『詳解 Objective-C 2.0』によると『宣言したクラスおよびそのサブクラス内でアクセス可能』で、デフォルトの設定でもあるということから、特に意識する必要はありません。

EAGLContextクラスの変数contextは、レンダリングコンテキストです。

GLuint型の変数は、viewRenderbufferはレンダバッファオブジェクト、viewFramebufferはフレームバッファオブジェクトを示す識別子です。

GLint型の変数backingWidthとbackingHeightは、レンダバッファから取得するサイズで、ビューポートのサイズの設定に使用します。


●OpenGLES2DView.mソースファイル

#import "OpenGLES2DView.h"

@implementation OpenGLES2DView

+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

#pragma mark -
- (BOOL)createFramebuffer {

    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }

    return YES;
}

- (id)initWithCoder:(NSCoder*)coder
{
    if((self = [super initWithCoder:coder])) {
        // Get the layer
        CAEAGLLayer *eaglLayer = (CAEAGLLayer*) self.layer;
        eaglLayer.opaque = YES;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                [NSNumber numberWithBool:NO],
kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGB565,
kEAGLDrawablePropertyColorFormat, nil];
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

        if(!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
            [self release];
            return nil;
        }

        glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
        glViewport(0, 0, backingWidth, backingHeight);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrthof(0, self.frame.size.width, 0, self.frame.size.height, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glClearColor(0.78f, 0.78f, 0.78f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glEnableClientState (GL_VERTEX_ARRAY);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
        [context presentRenderbuffer:GL_RENDERBUFFER_OES];

        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
        glEnableClientState(GL_VERTEX_ARRAY);
    }

    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

7605

ソースファイルでは3つのメソッドが実装されています。

layerClassメソッドは、ビューの基盤レイヤとしてCAEAGLLayerオブジェクトを作成するためのもので、暗黙的に呼び出されます。

createFramebufferメソッドは、フレームバッファオブジェクトとレンダバッファの生成とコンテキストへのバインドを行うもので、initWithCoder:メソッドから呼び出されます。

initWithCoder:メソッドはビューをnibファイルから呼び出した後に追加でビューの初期化を行うもので、OpenGL ESに対応するための初期化が行われています。

1)layerClassメソッド

layerClassメソッドは、OpenGL ESを利用できるようにするため、ビューの基盤レイヤをCAEAGLLayerクラスに変更しています。
(『iOS OpenGL ESプログラミングガイド』のp.35『Core Animationレイヤへのレンダリング』の『2』を参照)

layerClass

+ (Class)layerClass

このクラスのインスタンスのためのレイヤの生成に使用するクラスを返します。

戻り値は、ビューのCore Animationレイヤの生成に使用するクラスを返します。

このメソッドはデフォルトでCALayerクラスのオブジェクトを返します。

サブクラスはこのメソッドをオーバーライドし、必要に応じて異なるレイヤクラスを返すことが出来ます。

例えば描画にOpenGL ESを使用する場合、このメソッドをオーバーライドしてCAEAGLLayerクラスのオブジェクトを返すことが出来ます。

このメソッドは、対応するレイヤオブジェクトを生成するために、ビューの生成の初期に一度だけ呼び出されます。



参考文献

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

UIView Class Reference

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る

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

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
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

Bose QuietComfort 20
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