GLFun(32)~OpenGL ESテンプレートの利用(7)

2012. 02. 24
Texture2Dクラスは、画像やテキストからOpenGL ESの2Dテクスチャを生成するクラスです。
(『GLFun(12)~Texture2Dクラス(1)』参照)

このクラスはOpenGL ES 1.1のみの対応なので、OpenGL ES 2.0でも使用できるように(今回のGLFunプロジェクトの移植に関する)必要最低限の修正を行います。


●Texture2D.hヘッダファイルの編集

OpenGL ES 2.0のgl.hのインポートと、3つの初期化メソッド(initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:、initWithImage:、initWithString:dimensions:alignment:fontName:fontSize:)にOpenGL ES 2.0からの呼び出しかどうかを判別する引数『version:(BOOL)useOpenGLES2』を追加します。
(太字が追加した部分)

#import <UIKit/UIKit.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES2/gl.h>

(中略)

- (id) initWithData:(const void*)data pixelFormat:(Texture2DPixelFormat)pixelFormat pixelsWide:(NSUInteger)width pixelsHigh:(NSUInteger)height contentSize:(CGSize)size version:(BOOL)useOpenGLES2;

(中略)

@interface Texture2D (Image)
- (id) initWithImage:(UIImage *)uiImage version:(BOOL)useOpenGLES2;
@end

(中略)

@interface Texture2D (Text)
- (id) initWithString:(NSString*)string dimensions:(CGSize)dimensions alignment:(UITextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size version:(BOOL)useOpenGLES2;
@end

7807

実際にOpenGL ES 1.1と2.0で判別した処理を行うのはinitWithData:~メソッドだけなのですが、ビューコントローラの描画メソッドから呼び出すのはinitWithImage:メソッドであり、そのinitWithImage:とinitWithString:~メソッドが内部でinitWithData:~メソッドを呼び出しているため、3つとも引数を追加します。


●Texture2D.mソースファイルの編集

OpenGL ES 2.0のglext.hのインポートと、initializeメソッドの修正、および3つの初期化メソッド(initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:、initWithImage:、initWithString:dimensions:alignment:fontName:fontSize:)にOpenGL ES 2.0からの呼び出しかどうかを判別する引数『version:(BOOL)useOpenGLES2』を追加します。
(太字が追加した部分)


1)initializeメソッドの修正

Texture2Dクラスにはイニシャライザのinitializeメソッドが有り、インスタンス作成時に暗黙的に呼び出されます。
(『GLFun(14)~Texture2Dクラス(3)』参照)

問題はinitializeメソッド内でOpenGL ES 1.1のみに存在する関数(glTexEnvglEnableClientState)を呼び出している点で、これによりOpenGL ES 2.0からTexture2Dクラスのインスタンスを作成しようとすると『EXC_BAD_ACCESS』が発生することになります。

この問題を回避するため、今回はinitializeメソッドの内容をinitWithData:~メソッドに移植し、initWithData:~メソッド内でOpenGL 1.1の場合は実行、2.0の場合は無視するようにします。

したがって、initializeメソッドの中身は空になります。

+ (void) initialize {
    // These calls need to get called once for the class to work, but if they are called before OpenGL knows about any textures, it crashes,
}


2)initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:メソッドの修正

上記の理由により、initializeメソッドの内容をOpenGL ES 1.1のみで実行するよう追加を行います。
(太字が追加修正した部分)

- (id) initWithData:(const void*)data pixelFormat:(Texture2DPixelFormat)pixelFormat pixelsWide:(NSUInteger)width pixelsHigh:(NSUInteger)height contentSize:(CGSize)size version:(BOOL)useOpenGLES2
{
    GLint saveName;
    if((self = [super init])) {
        if (!useOpenGLES2) {
            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        }


(中略)

    }
    return self;
}

7808


3)initWithImage:メソッドの修正

initWithImage:メソッドは内部でinitWithData:~メソッドを呼び出しているので、対応できるよう引数を追加していますが、引数を渡している以外は何もしていません。
(太字が追加した部分)

- (id) initWithImage:(UIImage *)uiImage version:(BOOL)useOpenGLES2
{

(中略)

    self = [self initWithData:data pixelFormat:pixelFormat pixelsWide:width pixelsHigh:height contentSize:imageSize version:useOpenGLES2];

    CGContextRelease(context);
    free(data);

    return self;
}

7809


4)initWithString:dimensions:alignment:fontName:fontSize:メソッドの修正

initWithImage:メソッドと同様です。
(太字が追加した部分)

- (id) initWithString:(NSString*)string dimensions:(CGSize)dimensions alignment:(UITextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size version:(BOOL)useOpenGLES2
{

(中略)

    self = [self initWithData:data pixelFormat:kTexture2DPixelFormat_A8 pixelsWide:width pixelsHigh:height contentSize:dimensions version:useOpenGLES2];

    CGContextRelease(context);
    free(data);

    return self;
}

7810


●Shader.vsh頂点シェーダプログラムの編集

頂点シェーダプログラムでは、4つの変数宣言の追加と、頂点座標値への正射影行列の適用、そしてテクスチャ座標の受け渡しの追加を行っています。
(太字が追加修正した部分)

attribute vec4 position;
attribute vec2 texcoord;

varying vec4 colorVarying;
varying vec2 texcoordVarying;

uniform vec4 constColor;
uniform mat4 projectionMatrix;


void main()
{
    gl_Position = projectionMatrix * position;

    colorVarying = constColor;
    texcoordVarying = texcoord;
}

7811

テンプレートにある描画色のattribute値colorと、アニメーション用の変換座標のuniform値translateは不要なので削除します。

宣言に追加した4つの変数は以下の通りです。
・テクスチャ座標:texcoord
・フラグメントシェーダに渡すテクスチャ座標:texcoordVarying
・プリミティブの描画色:constColor
・正射影行列:projectionMatrix

gl_Positionでの頂点座標の指定に、正射影行列projectionMatrixを適用します。

プログラムにあるアニメーション用のy座標補正は不要なので削除します。

フラグメントシェーダに渡す描画色は、attribute値colorからuniform値constColorに変更します。

また、フラグメントシェーダへ渡すテクスチャ座標の設定を追加します。


●Shader.fshフラグメントシェーダプログラムの編集

フラグメントシェーダプログラムでは、3つの変数宣言と、テクスチャ使用フラグによるフラグメント色の分岐指定、そしてテクスチャ参照関数によるテクスチャの適用を追加しています。
(太字が追加した部分)

varying lowp vec4 colorVarying;
varying lowp vec2 texcoordVarying;

uniform sampler2D texture;
uniform bool flag;


void main()
{
    if (!flag)
        gl_FragColor = colorVarying;
    else
        gl_FragColor = texture2D(texture, texcoordVarying.st);

}

7812

宣言に追加した3つの変数は以下の通りです。
・頂点シェーダから渡されたテクスチャ座標:texcoordVarying
・2Dテクスチャへのハンドル:texture
・テクスチャ使用を示すフラグ:flag

フラグメント色は、3種の図形の場合は単一の描画色のみ、画像の場合はテクスチャの色のみと排他的に塗りつぶすので、テクスチャ使用のフラグによって分岐しています。

テクスチャ使用の場合は、テクスチャ参照関数texture2Dでテクスチャを貼り付けます。
(『iPhone/iPadゲーム開発のゲンバから…/OpenGL ES 2.0 ④』、『GLSL~8.7 テクスチャ参照関数』、『GLSL~4.1 基本の型』、『GLSL~5.5 ベクトル要素』参照)



参考文献

iPhone/iPadゲーム開発のゲンバから…/OpenGL ES 2.0 ④

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