GLFun(12)~Texture2Dクラス(1)

2011. 12. 29
Texture2DクラスはApple社が提供している、画像やテキストからOpenGL ESの2Dテクスチャを生成するクラスです。

コードの冒頭にあるライセンス条項に付いては、壁谷武憲さんのサイト『cabi@net:work』にある左側のフレームにある『文書』のリンクから『Appleのサンプルプログラムに付いているライセンス条項(和訳)』にて翻訳されているので参照してください。


●Texture2D.hヘッダファイル

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

//CONSTANTS:


typedef enum {
    kTexture2DPixelFormat_Automatic = 0,
    kTexture2DPixelFormat_RGBA8888,
    kTexture2DPixelFormat_RGB565,
    kTexture2DPixelFormat_A8,
} Texture2DPixelFormat;

//CLASS INTERFACES:

/*
This class allows to easily create OpenGL 2D textures from images, text or raw data.
The created Texture2D object will always have power-of-two dimensions.
Depending on how you create the Texture2D object, the actual image area of the texture might be smaller than the texture dimensions i.e. "contentSize" != (pixelsWide, pixelsHigh) and (maxS, maxT) != (1.0, 1.0).
Be aware that the content of the generated textures will be upside-down!
*/

@interface Texture2D : NSObject
{
@private
    GLuint    _name;
    CGSize    _size;
    NSUInteger    _width,
                           _height;
    Texture2DPixelFormat    _format;
    GLfloat    _maxS,
                     _maxT;
}

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

@property(readonly) Texture2DPixelFormat pixelFormat;
@property(readonly) NSUInteger pixelsWide;
@property(readonly) NSUInteger pixelsHigh;

@property(readonly) GLuint name;

@property(readonly, nonatomic) CGSize contentSize;
@property(readonly) GLfloat maxS;
@property(readonly) GLfloat maxT;
@end

/*
Drawing extensions to make it easy to draw basic quads using a Texture2D object.
These functions require GL_TEXTURE_2D and both GL_VERTEX_ARRAY and GL_TEXTURE_COORD_ARRAY client states to be enabled.
*/

@interface Texture2D (Drawing)
- (void) drawAtPoint:(CGPoint)point;
- (void) drawInRect:(CGRect)rect;
@end

/*
Extensions to make it easy to create a Texture2D object from an image file.

Note that RGBA type textures will have their alpha premultiplied - use the blending mode (GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

*/

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

/*
Extensions to make it easy to create a Texture2D object from a string of text.
Note that the generated textures are of type A8 - use the blending mode (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).
*/

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

7705


1)インポート

Texture2DクラスはNSObjectクラスをスーパークラスとした、OpenGL ESでのテクスチャを生成するクラスです。

OpenGL ESやCore Graphicsの関数で大半が占められていますが、画像からテクスチャを生成する『initWithImage:』メソッドでのUIImageクラスや、テキストからテクスチャを生成する『initWithString:dimensions:alignment:fontName:fontSize:』メソッドでのUIFontクラスなど、一部UIKitの関数も含まれるため、UIKit.hをインポートしています。

またOpenGL ESについてはES1のgl.hのみインポートしているので、このクラスはOpenGL ES 1.1のみに対応することが分かります。


2)定数

Texture2DPixelFormatは2Dテクスチャ画像のピクセルフォーマットを示す識別子で、列挙型で4つの定数を設定しています。

kTexture2DPixelFormat_Automatic未使用
kTexture2DPixelFormat_RGBA8888アルファチャンネルを含む
32ビットのピクセルフォーマット
kTexture2DPixelFormat_RGB565アルファチャンネルを含まない
16ビットのピクセルフォーマット
kTexture2DPixelFormat_A8マスク画像またはテキスト用の
8ビットのピクセルフォーマット


3)クラスのインターフェイス

このクラスは画像やテキスト、または生データからOpenGLの2Dテクスチャを簡単に生成することができます。
生成されたTexture2Dオブジェクトは、常に2の累乗の大きさになります。
Texture2Dオブジェクトの生成の仕方によって、テクスチャの実際の画像領域はテクスチャのサイズよりも小さくなるかもしれません。
すなわち、『"contentSize" != (pixelsWide, pixelsHigh)』で『(maxS, maxT) != (1.0, 1.0)』です。
生成されたテクスチャの内容は逆さまになることに注意してください。


テクスチャ画像サイズの留意点)

OpenGLでは基本的にテクスチャサイズは2の累乗(べき乗とも呼ばれます。英語ではPower Of Two、略してPOTと記述される場合もあります)にする必要があります。
(『マイナビニュース/エンラープライズ/【コラム】実践! iPhoneアプリ開発 (20) タワーディフェンスゲームの作り方 (3) - 背景の描画』参照)

拡張機能(GL_OES_texture_npotなど)で2の累乗のサイズも扱うことができるという話もあるようですが、『iOS OpenGL ESプログラミングガイド』の中でも
  • 『PowerVR SGXは、2のべき乗以外のキューブマップテクスチャやミップマップテクスチャはサポートしていません。』

  • 『PVRTexToolを使用してテクスチャを圧縮している場合は、2のべき乗の長さを持つ正方形の テクスチャを作成しなければなりません。』
と制約があるので、基本的には2の累乗サイズでテクスチャを用意するのが無難のようです。

今回のGLFunプロジェクトで使用するテクスチャ画像iphone.pngは52×100ピクセルですが、画像からテクスチャを生成する『initWithImage:』メソッドや、テキストからテクスチャを生成する『initWithString:dimensions:alignment:fontName:fontSize:』メソッド内で、任意のサイズから2の累乗のサイズへの補正を行っているからです。

実際には64×128ピクセルのテクスチャとして生成した後に、52×100ピクセルのテクスチャリングされたプリミティブとして表示し、サイズや縦横比を気にしなくて済むように処理されています。

定数)

ここで宣言されているインスタンス変数は全て@privateになっており、Texture2Dクラス内でのみアクセス可能で、サブクラスでは使用できません。

変数名内容
 GLuint _name テクスチャの名前(識別番号)
 CGSize _size テクスチャ画像の実サイズ
 NSUInteger _width テクスチャの幅(2の累乗に補正した値)
 _height テクスチャの高さ(2の累乗に補正した値)
 Texture2DPixelFormat  _format ピクセルフォーマット
 GLfloat _maxS テクスチャ座標系での幅比
(テクスチャの実幅/2の累乗に補正した幅)
 _maxT テクスチャ座標系での高さ比
(テクスチャの実高さ/2の累乗に補正した高さ) 

前述の通り、テクスチャの幅と高さは2の累乗にする必要があるため、元となる画像の実サイズ_sizeの他に2の累乗に補正した_widthと_height、更に表示する際に元の実サイズに補正するための_maxSと_maxTという変数を用意しています。

_maxSと_maxTは、横軸をS、縦軸をTとしたテクスチャ座標系の値で、詳細は後述します。

また、ここでの変数名は全て頭に『_(アンダースコア)』が付いていますが、『_』で始まる接頭語はAppleがインスタンス変数やプライベートメソッドを名付けるための予約語で、一般の開発者が使用してはいけないことになっています。
(『詳解 Objective-C 2.0』(最新版『詳解 Objective-C 2.0 第3版』)『Appendix B コーディングの指針』にある項目『接頭語』や、『ポッチンルーム/ポッチンコンバート/Cocoaのためのコーディングガイドライン』(原文:『Coding Guidelines for Cocoa』)の『命名の基本』のページにある項目『文字使いの慣習』参照)

プロパティの宣言)

上記で宣言した7つのインスタンス変数は、全てプロパティとしても宣言しています。


4)描画カテゴリ

Texture2Dクラスでは、内部で『Drawing』『Image』『Text』の3つのカテゴリを追加しています。
(カテゴリについては『Sections(2)~カテゴリ』を参照)

特に巨大なクラスというわけではありませんが、特性ごとにモジュールを明確に分けているものと思われます。

Drawingカテゴリは、Texture2Dオブジェクトを使用して基本的な四角形を簡単に描画するための拡張機能です。
これらの関数はGL_TEXTURE_2Dと、クライアント状態のGL_VERTEX_ARRAYとGL_TEXTURE_COORD_ARRAYの両方を有効にする必要があります。


drawAtPoint:メソッドは指定した座標を中心に元画像サイズのテクスチャリングした矩形を描画します。

drawInRect:メソッドは指定した矩形にテクスチャリングします。

drawAtPoint:では指定した座標を中心としますが、drawInRect:は左下角を原点として描画されるので注意してください。

また、drawAtPoint:は元画像と同じサイズの矩形を描画しますが、drawInRectは異なる大きさ・縦横比を指定しても、それに合わせてスケーリングされて描画します。


5)画像カテゴリ

画像ファイルからTexture2Dオブジェクトを簡単に生成するための拡張機能です。
RGBA型のテクスチャはブレンディングモード(GL_ONE, GL_ONE_MINUS_SEC_ALPHA)を使用して、事前にアルファを乗算することに注意してください。


initWithImage:メソッドは、画像ファイルからテクスチャオブジェクトを作るメソッドで、OpenGL ESで扱えるようにサイズを2の累乗に補正したり、最大テクスチャサイズ以下に補正するルーチンも含まれています。


6)テキストカテゴリ

テキストの文字列からTexture2Dオブジェクトを簡単に生成するための拡張機能です。
生成されるテクスチャはA8型で、ブレンディングモード(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)を使用することに注意してください。


initWithString:dimensions:alignment:fontName:fontSize:メソッドは、テキスト文字列からテクスチャを作るメソッドです。

使用する機会は少ないと思いますが、一通りの解説は行います。



参考文献

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

OpenGL ES 1.1 Reference Pages

Khronos OpenGL ES API Registry

cabi@net:work

マイナビニュース/エンラープライズ/【コラム】実践! iPhoneアプリ開発 (20) タワーディフェンスゲームの作り方 (3) - 背景の描画

ポッチンルーム/ポッチンコンバート/Cocoaのためのコーディングガイドライン

Coding Guidelines for Cocoa

詳解 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 他

商品詳細を見る






Wave SoundTouch music system IV
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

Wave SoundTouch music system IV
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