GLFun(21)~Texture2Dクラス(10)

2012. 01. 15
未適用アフィン変換のチェックと適用)

GLFun(20)~Texture2Dクラス(9)』で述べたように、テクスチャ用画像のサイズが最大テクスチャサイズを超えていた場合にはアフィン変換で補正処理を行いますので、アフィン変換を適用する必要があります。

未適用のアフィン変換があるかどうかをCGAffineTransformIsIdentityで確認し、あればCGContextConcatCTMで適用します。

CGContextConcatCTM

void CGContextConcatCTM (
    CGContextRef c,
    CGAffineTransform transform
);

コンテキスト内のユーザ座標系を、指定した行列を使用して変換します。

関数CGContextConcatCTMを呼び出すと、2つの行列を乗算によって連結(つまり結合)します。

行列を連結する順序は、演算が可換ではないため重要です。

CGContextConcatCTMを呼び出すと、コンテキスト内のCTMの結果は次のようになります。

CTMnew = transform * CTMcontext

c:グラフィックスコンテキストを指定します。

transform:指定されたコンテキストの現在の変換行列に適用する変換行列を指定します。

コンテキストへの画像の描画)

CGContextDrawImageを使用して、ビットマップグラフィックスコンテキストにテクスチャ用画像を描画します。

第一引数は画像を描画するコンテキストcontextを指定します。

第二引数は画像を描画する領域で、CGRectMakeで原点とサイズを指定します。

サイズはCGImageGetWidthCGImageGetHeightで元画像imageから取得します。

第三引数は描画する画像imageを指定します。

この時点でのコンテキストの状態は、左下角を原点とするCore Graphics座標系で、透明にクリアされた(2の累乗補正された)width×heightの領域内に、元画像を元サイズのまま描画していることになっています。

7721

CGContextDrawImage

void CGContextDrawImage (
    CGContextRef c,
    CGRect rect,
    CGImageRef image
);

グラフィックスコンテキストに画像を描画します。

Quartzは、画像が不均衡であれば必要に応じてrectパラメータで指定された境界に適合するように伸縮します。

c:画像を描画するグラフィックスコンテキストを指定します。

rect:画像を描画するための境界ボックスのユーザ空間での位置と大きさを指定します。

image:描画する画像を指定します。

RGBA8888からRGB565へのビットマップデータの変換)

アルファチャンネル無しのビットマップデータは、内部的にはピクセル単位で『RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA』という各色8ビットずつの32ビットデータ(RGBA8888)ですので、これを本来の『RRRRRGGGGGGBBBBB』という16ビットデータ(RGB565)に変換する必要があります。
(ソースコードのコメント文のRGBA8888の表現ではRが9個あったりしますが、正しくは8個です)

この変換は、ビットマップデータを格納しているメモリ領域dataから32ビットずつデータを取り出し、各色に対してビットマスクで抽出、ビットシフトで長さを切り詰め、論理和で合成して一時メモリ領域tempDataに埋めて、最後にtempDataの内容をdataに入れ替えるという作業になります。

最初に一時メモリ領域tempDataをmallocで、(2の累乗補正した)高さ×幅×2バイト(16ビット)分を確保します。

次に元となる画像データの領域dataから32ビットずつピクセルデータを取り出すためのポインタinPixel32と、一時メモリ領域tempDataに16ビットずつピクセルデータを書き出すためのポインタoutPixel16を設定します。

続いてforループで(width * height)個あるピクセルデータを一つずつ(32ビットずつ)取り出し、ビットシフト演算でRGBA8888の32ビットからRGB565の16ビットへ変換します。

まず(*inPixel32 >> 0)で、データの頭出しを行います。
(Rの場合は先頭アドレスなのでずらす必要が無く、0を指定しています)

そしてRの8ビット分を抽出するため、ビットマスク0xFFでビット論理積を取ります。

抽出したRの8ビットデータを5ビットに切り詰めるため、右ビットシフトで3つずらします。

5ビットにしたRデータは、後で16ビットのデータに論理和で合成するため、左ビットシフトで11個ずらします。

GとBについても同様にビット操作を行い、RGBを論理和で合成して、16ビットデータをoutPixel16に順次入れていきます。

ビット操作に関しては下図を参照してください。

7711

これによりRGBA8888の場合は各色8ビット(0~255)であった色分解能から、RとBは5ビット(0~32)の1/8に、Gは6ビット(0~64)の1/4の色分解能に低下します。

全てのピクセルに対して変換が完了したら元画像データのメモリdataを一度解放し、一時メモリtempDataの内容をdataに入れ直します。

テクスチャオブジェクトの作成)

画像データが完成したので、initWithData:pixelFormat:pixelsWide:pixelsHigh:contentSize:を呼び出してテクスチャオブジェクトを生成、バインド、設定します。
(同メソッドについては『GLFun(16)~Texture2Dクラス(5)』を参照してください)

コンテキストと画像データの解放)

テクスチャオブジェクトの作成が完了したので、不要となったコンテキストはCGContextReleaseで、画像データはfreeで解放します。

CGContextRelease

void CGContextRelease (
    CGContextRef c
);

グラフィックスコンテキストの保持カウントを減らします。

この関数はCFReleaseと同等で、cがNULLの場合以外ではエラーは発生しません。

c:解放するグラフィックスコンテキストを指定します。



参考文献

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

OpenGL ES 1.1 Reference Pages

CGContext Reference

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

商品詳細を見る






SoundLink Mini Bluetooth speaker_ii_limited
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
05 | 2017/06 | 07
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

SoundLink Mini Bluetooth speaker_ii_limited
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