電子ガジェットいろいろ

電子系のガジェットやアプリ開発等の話題を書いてます

iPhoneでのOpenGLの簡単な遊び方 (iPhoneSDK3.1以降)

以前のエントリーOpenGLの簡単な遊び方を書きましたが、iPhoneSDK3.1以降でテンプレートが変わったので、簡単に説明します。

新しいテンプレートではOpenGL ES2.0対応の場合はES2.0の機能を使い、対応していない場合はES1.1の機能を使うように、レンダリングの処理を分けて処理するようになってますが、今回はOpenGL ES1.1の処理だけするようにします。

新規プロジェクト作成

テンプレートは"OpenGL ES Application"を選んでプロジェクトを作成してください。
今回はそのまま実行すると、四角形が上下するだけです。

前準備

Classesのフォルダを見ると、レンダリング処理の部分が別クラスで作られています。
ES1Renderer.m(.h)はOpenGL ES1.1用クラス
ES2Renderer.m(.h)はOpenGL ES2.0用クラス
今回はES1.1用の処理だけ使うので、"EAGLView.m"のinitWithCoderメソッドを以下の様に書き換えます。
・renderer = [[ES2Renderer alloc] init];"の行を"renderer = [[ES1Renderer alloc] init];"へ
・フレームレートの調整は"animationFrameInterval = 1;"のの値を調整してください。数値を増やす事により、フレームレートを下げることができます。

//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:
- (id) initWithCoder:(NSCoder*)coder
{    
    if ((self = [super initWithCoder:coder]))
	{
        // Get the layer
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
        
        eaglLayer.opaque = TRUE;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
		
		// ES2Renderer -> ES1Renderer
		renderer = [[ES1Renderer alloc] init];
		
		if (!renderer)
		{
			renderer = [[ES1Renderer alloc] init];
			
			if (!renderer)
			{
				[self release];
				return nil;
			}
		}
        
		animating = FALSE;
		displayLinkSupported = FALSE;
		animationFrameInterval = 1;    // ここでフレームレートの調整
		displayLink = nil;
		animationTimer = nil;
		
		// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
		// class is used as fallback when it isn't available.
		NSString *reqSysVer = @"3.1";
		NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
		if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
			displayLinkSupported = TRUE;
    }
	
    return self;
}

遊び方

あとは"ES1Renderer.m"のrenderメソッドにOpenGLのコードを書いて遊ぶことができます。
以前のエントリーと同じ事をここでもやってみます。
以下の説明は、すべて"ES1Renderer.m"のrenderメソッドに対して行います。
このrenderメソッドにOpenGLのコードを書いていけば遊ぶことができます。

上下運動だけではつまらないので、前回と同じようにひねりながら回転させてみます。

glLoadIdentity();
glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f);
transY += 0.075f;

上のような3行をそのまま下のように書き換えてください。

glRotatef(3.0f, 1.0f, 1.0f, 1.0f);

これを実行すると、四角形がひねりながら回転します。

これがでたら、次は"iPhone SDKでOpenGLに挑戦 立方体を表示してみよう"を参考にして立方体でも表示してみましょう。

OpenGLで作るiPhone SDKゲームプログラミング

OpenGLで作るiPhone SDKゲームプログラミング

iPhoneプログラミングUIKit詳解リファレンス

iPhoneプログラミングUIKit詳解リファレンス