GLFun(18)~Texture2Dクラス(7)

2012. 01. 08
二次元テクスチャ画像の設定)

ピクセルフォーマット別に二次元テクスチャ画像をglTexImage2Dで設定します。

ピクセルフォーマットはヘッダファイルで宣言している識別子(『GLFun(12)~Texture2Dクラス(1)』参照)で、initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:メソッドの呼び出し元であるinitWithImage:やinitWithString:dimensions:alignment:fontName:fontSize:メソッドで設定され、引数で渡されます。

第一引数はターゲットのテクスチャで、GL_TEXTURE_2Dである必要があります。

第二引数は詳細レベル番号で、ミップマップの縮小レベルを示します。

今回はミップマップを使用しないので0になります。

第三引数はテクスチャの色要素を指定します。
(第七引数のformatと同じである必要があります)

この値はピクセルフォーマットに応じてGL_RGBA、GL_RGB、AL_ALPHAのいずれかを指定します。

第四、第五引数はテクスチャの幅および高さで、呼び出し時の引数が渡されます。

ここで渡されるテクスチャサイズは2の累乗に補正された値です。

第六引数は境界線の幅で、0にする必要があります。

第七引数はピクセルデータのフォーマットで、第三引数のinternalformatと同じである必要があります。

第八引数はピクセルデータのデータ型で、色情報がどのように格納されているかを示しています。

32ビットのビッグエンディアンの時のGL_RGBAはGL_UNSIGNED_BYTE、16ビットのビッグエンディアンの時のGL_RGBはGL_UNSIGNED_SHORT_5_6_5、8ビットの時のGL_ALPHAはGL_UNSIGNED_BYTEを指定しています。
(『yunoの雑記帳/プログラミングノート/OpenGL/OpenGLピクセルフォーマット』参照)

第九引数はテクスチャ画像を納めているメモリdataへのポインタを指定します。

デフォルトは3種のピクセルフォーマット以外の場合(コードの記述上はいずれかになるはずなので、何らかの異常が発生した場合)は、raise:format:メソッドで例外を発生させます。

例外のメッセージはNSInternalInconsistencyExceptionで、コード内で予期しない状態が起こったことを示します。

最後にテクスチャを描画するための変数(サイズ、幅、高さ、ピクセルフォーマット、最大S比と最大T比)を設定します。

glTexImage2D 

void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); 

二次元テクスチャ画像を指定します。

テクスチャリングは、テクスチャリングが有効になっている各グラフィカルプリミティブ上に、指定されたテクスチャ画像の一部をマッピングします。

二次元のテクスチャリングを有効や無効にするには、引数GL_TEXTURE_2DでglEnableglDisableを呼び出します。

二次元のテクスチャリングの初期状態は無効になっています。

テクスチャ画像を定義するには、glTexImage2Dを呼び出します。

引数は、高さ、幅、境界線の幅、詳細レベル数(glTexParameter参照)、色要素数などのテクスチャ画像のパラメータを表します。

最後の3つの引数は、画像のメモリ内での表現について表します。

データはtypeに応じて符号無しbyteまたはshortのシーケンスとしてpixelsから読み込まれます。

これらの値はformatに応じて要素を形成するために、1つ、2つ、3つ、あるいは4つの値のセットにグループ化されます。

typeがGL_UNSIGNED_BYTEの場合、各byteはformatに応じて1つの色要素として解釈されます。

typeがGL_UNSIGNED_SHORT_5_6_5、GL_UNSIGNED_SHORT_4_4_4_4、GL_UNSIGNED_SHORT_5_5_5_1のいずれかの場合、各符号無し値は決められたフォーマットに従って、色要素は単一のピクセルの全ての要素を含むとして解釈されます。

最初の要素はテクスチャ画像の左下角に対応します。

以降の要素はテクスチャ画像の最下行内のテクセルを左から右へ進み、その後テクスチャ画像の上の行に続きます。

最後の要素はテクスチャ画像の右上角に対応します。

デフォルトでは、全ての幅のピクセルが読み込まれた後以外、読み込むポインタは次の4バイト先に進み、隣接するピクセルは隣接するメモリ位置から取得されます。

4バイト行のアライメントは引数GL_UNPACK_ALIGNMENTでglPixelStoreiによって指定され、1、2、4、8バイトに設定することができます。

formatはピクセル内の各要素の構成を決定します。

以下のシンボリック値のいずれかを設定できます。

GL_ALPHA
各要素は単一のアルファ成分です。
GLは浮動小数点に変換し、赤、緑、青用に0を付加することによってRGBA要素に組み込みます。

GL_RGB
各要素はRGBの3つです。
GLは固定小数点または浮動小数点に変換し、アルファ用に1を付加することによってRGBA要素に組み込みます。

GL_RGBA
各要素は4つ全ての成分が含まれます。
GLは固定小数点または浮動小数点に変換します。

GL_LUMINANCE

各要素は単一の輝度値です。
GLは固定小数点または浮動小数点に変換し、アルファ用に1を付加し、赤、緑、青用に3回輝度値を複製することによってRGBA要素に組み込みます。

GL_LUMINANCE_ALPHA

各要素は輝度/アルファのペアです。
GLは固定小数点または浮動小数点に変換し、赤、緑、青用に3回輝度値を複製することによってRGBA要素に組み込みます。

pixelsにはNULLを指定することができます。

この場合テクスチャメモリはwidth幅とheight高さのテクスチャを格納するために割り当てられます。

その後、このテクスチャメモリを初期化するサブテクスチャをダウンロードすることができます。

ユーザがプリミティブにテクスチャ画像の初期化されていない部分を適用しようとした場合、この画像は未定義です。

glTexImage2DはglBindTextureで指定された現在バインドされているテクスチャのための二次元テクスチャと、glActiveTextureで指定された現在のテクスチャユニットを指定します。

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

formatが有効な定数でない場合、GL_INVALID_ENUMが発生します。

typeが有効な定数でない場合、GL_INVALID_ENUMが発生します。

levelが0より小さい場合、GL_INVALID_VALUEが発生します。

GL_MAX_TEXTURE_SIZEが返す値をmaxとした時に、levelがlog2maxより大きい場合、GL_INVALID_VALUEが発生します。

internalformatが有効な定数でない場合、GL_INVALID_VALUEが発生します。

widthまたはheightが0より小さい、あるいはGL_MAX_TEXTURE_SIZEより大きい、もしくは整数をkとした時に2k + 2borderで表すことができない場合、GL_INVALID_VALUEが発生します。

borderが0でない場合、GL_INVALID_VALUEが発生します。

internalformatformatが同じでない場合、GL_INVALID_OPERATIONが発生します。

typeがGL_UNSIGNED_SHORT_5_6_5で、formatがGL_RGBでない場合、GL_INVALID_OPERATIONが発生します。

typeがGL_UNSIGNED_SHORT_4_4_4_4の一つ、またはGL_UNSIGNED_SHORT_5_5_5_1でformatがGL_RGBAでない場合、GL_INVALID_OPERATIONが発生します。

target:ターゲットテクスチャを指定します。
GL_TEXTURE_2Dである必要があります。

level:詳細レベル番号を指定します。
レベル0は基準画像レベルです。
レベルnn番目のミップマップ縮小画像です。
この値は0以上である必要があります。

internalformat:テクスチャの色要素を指定します。
formatと同じである必要があります。
GL_ALPHA、GL_RGB、GL_RGBA、GL_LUMINANCE、またはGL_LUMINANCE_ALPHAのシンボリック値が有効です。

width:テクスチャ画像の幅を指定します。
整数をnとすると、2n + 2borderにする必要があります。
全ての実装で、少なくとも幅64テクセルのテクスチャ画像をサポートします。

height:テクスチャ画像の高さを指定します。
整数をmとすると、2m + 2borderにする必要があります。
全ての実装で、少なくとも高さ64テクセルのテクスチャ画像をサポートします。

border:境界線の幅を指定します。
この値は0にする必要があります。

format:ピクセルデータのフォーマットを指定します。
この値はinternalformatと同じにする必要があります。
GL_ALPHA、GL_RGB、GL_RGBA、GL_LUMINANCE、そしてGL_LUMINANCE_ALPHAのシンボリック値が有効です。

type:ピクセルデータのデータ型を指定します。
GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT_5_6_5、GL_UNSIGNED_SHORT_4_4_4_4、そしてGL_UNSIGNED_SHORT_5_5_5_1のシンボリック値が有効です。

pixels:メモリ内の画像データへのポインタを指定します。

raise:format:

+ (void)raise:(NSString *)name format:(NSString *)format...

例外を生成し発生させる便利なメソッドです。

ユーザ定義の情報は、生成される例外オブジェクトはnilになります。

name:例外の名前を指定します。

format,:以降に続く変数の引数のため、人が読めるメッセージの文字列(つまり例外の理由)の変換仕様を指定します。

...:(printfの書式に沿って)書式を揃えた例外の理由に挿入する変数情報を指定します。

一般的な例外名

NSExceptionによって定義される例外。

extern NSString *NSGenericException;
extern NSString *NSRangeException;
extern NSString *NSInvalidArgumentException;
extern NSString *NSInternalInconsistencyException;
extern NSString *NSMallocException;
extern NSString *NSObjectInaccessibleException;
extern NSString *NSObjectNotAvailableException;
extern NSString *NSDestinationInvalidException;
extern NSString *NSPortTimeoutException;
extern NSString *NSInvalidSendPortException;
extern NSString *NSInvalidReceivePortException;
extern NSString *NSPortSendException;
extern NSString *NSPortReceiveException;
extern NSString *NSOldStyleException;

NSGenericException
例外の総称。
通常はより具体的な例外名を使用する必要があります。

NSRangeException
文字列の終端を超えるなど、データの範囲外へのアクセスを試みた時に生じる例外の名前です。

NSInvalidArgumentException
非nilオブジェクトが要求されているところにnilポインタを指定するなど、メソッドに無効な引数を渡した時に生じる例外の名前です。

NSInternalInconsistencyException
内部アサーションが失敗し、呼び出したコード内で予期しない状態が起こった時に生じる例外の名前です。

NSMallocException
廃止されています。現在使用されていません。

NSObjectInaccessibleException
リモートオブジェクトがアクセスしてはいけないスレッドからアクセスされた時に生じる例外の名前です。
詳細はNSConnection(Mac OS X)のenableMultipleThreadsを参照してください。

NSObjectNotAvailableException
オブジェクトがベンドされていないため、NSConnection(Mac OS X)のリモート側がオブジェクトへのメッセージ送信を拒否された時に生じる例外の名前です。
(『The comp.lang.objective-C FAQ listing 日本語訳/リモートオブジェクト間でメッセージを転送するにはどうすればよいですか』参照)

NSDestinationInvalidException
内部アサーションが失敗し、分散オブジェクト内で予期しない状態が起こった時に生じる例外の名前です。
これは分散オブジェクト特有の例外です。

NSPortTimeoutException
送信または受信動作中に設定していたポートの期限がタイムアウトした時に生じる例外の名前です。
これは分散オブジェクト特有の例外です。

NSInvalidSendPortException
NSConnection(Mac OS X)の送信ポートが無効になった時に生じる例外の名前です。
これは分散オブジェクト特有の例外です。

NSInvalidReceivePortException
NSConnection(Mac OS X)の受信ポートが無効になった時に生じる例外の名前です。
これは分散オブジェクト特有の例外です。

NSPortSendException
送信時に一般的なエラーが発生。
これはNSPort特有の例外です。

NSPortReceiveException
受信時に一般的なエラーが発生。
これはNSPort特有の例外です。

NSOldStyleException
現在使用されていません。


6)deallocメソッド

- (void) dealloc
{
    if(_name)
        glDeleteTextures(1, &_name);

    [super dealloc];
}

deallocでは、テクスチャ名を再利用できるようにするため、glDeleteTexturesで_nameで名付けられたテクスチャを削除します。

glDeleteTextures

void glDeleteTextures(GLsizei n, const GLuint * textures);

名付けられたテクスチャを削除します。

glDeleteTexturesは、配列texturesの要素によって名付けられたn個のテクスチャを削除します。

テクスチャが削除された後、コンテンツまたは大きさを持っていない場合、名前は(glGenTexturesなどで)再利用するために解放されます。

現在バインドされているテクスチャが削除された場合、バインディングは(デフォルトテクスチャの)0に戻ります。

glDeleteTexturesは暗黙的に、0と既存のテクスチャに対応していない名前は無視します。

nが負の場合、GL_INVALID_VALUEが発生します。

n:削除するテクスチャの数を指定します。

textures:削除するテクスチャの配列を指定します。


7)descriptionメソッド

- (NSString*) description
{
    return [NSString stringWithFormat:@"<%@ = %08X | Name = %i | Dimensions = %ix%i | Coordinates = (%.2f, %.2f)>", [self class], self, _name, _width, _height, _maxS, _maxT];
}

descriptionは明示的には使用されていませんが、デバッグ用に変数などの設定された状態をstringWithFormat:メソッドで文字列にしたものです。

出力するパラメータは下表の通りです。
(『NSStringオブジェクトの書式』)

[self class]クラスオブジェクトを返す文字列
self自身のオブジェクト符号無し32bit整数、16進数表記
(0~9、A~F)、0埋め8桁
_nameテクスチャの名前符号有り32bit整数
_widthテクスチャの幅(2の累乗に補正した値)符号有り32bit整数
_heightテクスチャの高さ(2の累乗に補正した値)符号有り32bit整数
_maxS最大S比(テクスチャ座標系での幅比) 
(テクスチャの実幅/2の累乗に補正した幅)
64bit浮動小数点実数、小数点以下2桁
_maxT最大T比(テクスチャ座標系での高さ比)
(テクスチャの実高さ/2の累乗に補正した高さ)
64bit浮動小数点実数、小数点以下2桁

したがって、出力される文字列は『<クラスオブジェクト = 自身のオブジェクト | Name = 名前 | Dimensions = x高さ | Coordinates = (最大S比, 最大T比)>』となります。

initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:メソッドの『return self;』の手前で、NSLogとして出力してみると以下のようになります。

<Texture2D = 04B7EC60 | Name = 1 | Dimensions = 64x128 | Coordinates = (0.81, 0.78)>



参考文献

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

OpenGL ES 1.1 Reference Pages

yunoの雑記帳/プログラミングノート/OpenGL/OpenGLピクセルフォーマット

Foundation Constants

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