電子ガジェットいろいろ

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

iPhone SDKでOpenGLに挑戦 立方体を表示してみよう (iPhoneSDK3.1以降)

今回も以前のエントリーの内容をiPhoneSDK3.1以降用に書きます。

今回はOpenGL ES1.1用で表示する方法を書きます。

前準備

まず"iPhoneでのOpenGLの簡単な遊び方 (iPhoneSDK3.1以降)"を読んで、OpenGL ES1.1を使うように修正してください。
この修正をしたことを前提に進めます。

立方体のオブジェクト定義

"ES1Renderer.m"のメソッドrenderでオブジェクトの定義をしているので、squareVerticesの定義とsquareColorsを以下の様に修正します。

    static const GLfloat squareVertices[] = {
		-0.5f, -0.5f, -0.5f,
		0.5f, -0.5f, -0.5f,
		-0.5f,  0.5f, -0.5f,
		0.5f,  0.5f, -0.5f,
		-0.5f, -0.5f,  0.5f,
		0.5f, -0.5f,  0.5f,
		-0.5f,  0.5f,  0.5f,
		0.5f,  0.5f,  0.5f,
		-0.5f, -0.5f, -0.5f,
		0.5f, -0.5f, -0.5f,
		-0.5f, -0.5f,  0.5f,
		0.5f, -0.5f,  0.5f,
		-0.5f,  0.5f, -0.5f,
		0.5f,  0.5f, -0.5f,
		-0.5f,  0.5f,  0.5f,
		0.5f,  0.5f,  0.5f,
		-0.5f, -0.5f, -0.5f,
		-0.5f, -0.5f,  0.5f,
		-0.5f,  0.5f, -0.5f,
		-0.5f,  0.5f,  0.5f,
		0.5f, -0.5f, -0.5f,
		0.5f, -0.5f,  0.5f,
		0.5f,  0.5f, -0.5f,
		0.5f,  0.5f,  0.5f,
    };
	
    static const GLubyte squareColors[] = {
		255, 255,   0, 255,
		0,   255, 255, 255,
		0,     0,   0,   0,
		255,   0, 255, 255,
		255, 255,   0, 255,
		0,     0,   0,   0,
		0,   255, 255, 255,
		255,   0, 255, 255,
		255, 255,   0, 255,
		0,   255, 255, 255,
		0,     0,   0,   0,
		255,   0, 255, 255,
		255, 255,   0, 255,
		0,     0,   0,   0,
		0,   255, 255, 255,
		255,   0, 255, 255,
		255, 255,   0, 255,
		0,   255, 255, 255,
		0,     0,   0,   0,
		255,   0, 255, 255,
		255, 255,   0, 255,
		0,     0,   0,   0,
		0,   255, 255, 255,
		255,   0, 255, 255,
    };

その他のRenderの修正

"ES1Renderer.m"のメソッドrender内にさらに修正を加えます。

glClearでZバッファもクリアするようにします。

"glClear(GL_COLOR_BUFFER_BIT)"と書いてある分を探して、GL_DEPTH_BUFFER_BITを追加してください。

glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
glDrawArraysで指定してある要素の数を変更

”glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);”と書いてある分を探して、要素の数を4から24に変更してください。

glDrawArrays(GL_TRIANGLE_STRIP, 0, 24);

Zバッファの初期設定を追加

以下の文を参考にして、Zバッファの初期設定を追加してください。
"ES1Renderer.m"のメソッドresizeFromLayer内に追加します。

- (BOOL) resizeFromLayer:(CAEAGLLayer *)layer
{	
	// Allocate color buffer backing based on the current layer size
	glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
 	[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
	glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
	glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
	
	// ここから追加
	glGenRenderbuffersOES(1, &depthRenderbuffer);
	glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
	glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
	glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
	glEnable(GL_DEPTH_TEST);
	// ここまで追加

	if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
	{
		NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
		return NO;
	}
    
	return YES;
}

実行結果

ここまでで実行すると、以下の様に立方体が回転しています。
調整をしていないので、少々いびつですが・・・

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)

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

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