GLFun(25)~サンプルコードとの差異

2012. 01. 19
これまで説明した初版の内容と原著のサンプルコード(iOS 3.x版は『Beginning iPhone 3 Development Exploring the iPhone SDK』、iOS 4.x版は『Beginning iPhone 4 Development Exploring the iOS SDK』)との差異を見てみます。


●Texture2Dオブジェクトspriteの生成とバインド

画像描画に用いるTexture2Dオブジェクトspriteの生成とバインドですが、初版ではdrawメソッド内の画像選択時の場合に行っていますが、iOS 3.x版とiOS 4.x版ではビューの初期化を行っているinitWithCoder:内で行っています。

- (id)initWithCoder:(NSCoder*)coder {
    if (self = [super initWithCoder:coder]) {
        currentColor = [[UIColor redColor] retain];
        useRandomColor = NO;
        sprite = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"iphone.png"]];
        glBindTexture(GL_TEXTURE_2D, sprite.name);

    }
    return self;
}


●テクスチャオブジェクトの有効/無効化

初版の本文中の説明では、図形描画では不要なテクスチャオブジェクトを常時保持したくないという理由から、画像描画選択時にテクスチャオブジェクトを生成し、図形描画選択時にテクスチャオブジェクトを破棄を行っています。

しかしiOS 3.xとiOS 4.x版では、上記の通りビューの初期化時にテクスチャオブジェクトを生成・バインドし、図形描画時はglDisableでテクスチャを無効に、画像描画時はglEnableでテクスチャを有効にという処理に簡略化しています。

    switch (shapeType) {
        case kLineShape: {
            glDisable(GL_TEXTURE_2D);
            (中略)
            break;
        }
        case kRectShape: {
            glDisable(GL_TEXTURE_2D);
            (中略)
            break;
        }
        case kEllipseShape: {
            glDisable(GL_TEXTURE_2D);
            (中略)
            break;
        }
        case kImageShape:
            glEnable(GL_TEXTURE_2D);
            [sprite drawAtPoint:CGPointMake(lastTouch.x, self.frame.size.height - lastTouch.y)];
            break;
        default:
            break;
    }

単にコードを簡略化したかったのか、生成/破棄のリソース使用量や実行速度の都合かは分かりませんが、こういうやり方もあるようです。


●楕円描画の頂点座標生成

iOS 4.x版では、楕円の頂点座標生成において計算の簡略化が図られています。

楕円の半径)

初版とiOS 3.x版ではx軸の楕円の半径xradiusを求める際、始点と終点のx座標の大きさを比較し、それに応じて正の始点と終点の差を求めて半分にしていました。

xradius =(firstTouch.x > lastTouch.x) ?

(firstTouch.x - lastTouch.x)/2 :

(lastTouch.x - firstTouch.x)/2;

iOS 4.x版では、C言語の数学関数にある浮動小数点値の絶対値を求めるfabsfを使用し、単純に差の絶対値を求めて半分にしています。

xradius = fabsf((firstTouch.x - lastTouch.x) / 2);

y座標では、初版とiOS 3.x版ではy座標を反転してから始点と終点のy座標の大きさを比較し、それに応じて正の始点と終点の差をy座標を反転して求めて半分にしていました。

yradius =(self.frame.size.height - firstTouch.y > self.frame.size.height - lastTouch.y) ?

((self.frame.size.height - firstTouch.y) - (self.frame.size.height - lastTouch.y))/2 :

((self.frame.size.height - lastTouch.y) - (self.frame.size.height - firstTouch.y))/2;

iOS 4.x版では半径を求めるのにy座標を反転する必要が無いことから、x座標と同じく単純に差の絶対値を求めて半分にしています。

yradius = fabsf((firstTouch.y - lastTouch.y) / 2);

原点の移動)

楕円の原点座標を移動するためのオフセットですが、x座標は変わりません。

xOffset = (firstTouch.x > lastTouch.x) ? lastTouch.x + xradius : firstTouch.x + xradius;

y座標のオフセットは初版とiOS 3.x版では、y座標を反転してから始点と終点の大きさを比較し、それに応じてオフセットを求めていました。

yOffset =(self.frame.size.height - firstTouch.y > self.frame.size.height - lastTouch.y) ?

self.frame.size.height - lastTouch.y + yradius :

self.frame.size.height - firstTouch.y + yradius;

iOS 4.x版ではy座標を反転せずに始点と終点の大きさを比較し、反転した際の値を考慮して比較値に応じてオフセットを求めています。

yOffset =(firstTouch.y < lastTouch.y) ?

self.frame.size.height - lastTouch.y + yradius :

self.frame.size.height - firstTouch.y + yradius;

初版とiOS 3.x版ではOpenGLでの座標系に変換した上で大きさを比較するなど、思考の手順そのままに計算を記述していますが、iOS 4.x版では最終的にどういう計算になるかを考慮して単純化しています。


●画像ファイルiphone.png

ファイル名は同じですが、iOS 3.x版とiOS 4.x版、更にQuartzFunとGLFunで、画像ファイルiphone.pngのサイズとアルファチャンネルの有無の違いがあります。

iOS 3.x版のGLFunプロジェクト内の画像ファイルは52 x 100ピクセルですが、よく見ると四隅がグレーになっています。

7729

背景が同一色なので気になりませんが、背景色を変えると一目瞭然です。

7732

しかし実はQuartzFunの画像ファイルにはアルファ成分が有り、四隅が透明になっています。

7730

画像ファイルを入れ替えた場合は、Xcodeの『ビルド』メニューにある『すべてのターゲットをクリーニング』で前の画像ファイルをプロジェクトから破棄して作り直す必要があります。

画像ファイルにアルファ成分がある場合、OpenGLESViewクラスのglBlendFuncによって合成が行われます。
(『GLFun(9)~OpenGLES2DViewクラス(5)』参照)

7733

コードを修正しなくても四隅が抜けるようですが、drawメソッドの初期化処理の中にglEnable(GL_BLEND)を追加して、ブレンド機能を有効化してください。

またiOS 4.x版は24 x 47ピクセルとサイズや図柄が異なるだけでなく、QuartzFunとGLFunともにアルファ成分が無いものとなっています。

7731



参考文献

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

OpenGL ES 1.1 Reference Pages

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

商品詳細を見る






SoundSport Pulse wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
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

SoundSport Pulse wireless headphones
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