[iPhone] OpenGLを勉強している。

   

基本的なこと。


OpenGL ESにはES1とES2がある。ES1は全機種。ES2はiPhone3GSに対応している。

レンダラー:画面に描画するクラスのこと。ActionScriptにも出てきました。render関数が実装されていてこの中に描画するコードを記入。
以下render関数のデフォルトのコードを記載。

[cc lang=”html”]

– (void)render //レンダラー関数。描画のコードをここに記入する。
{
//描画するポリゴンの座標を記述
static const GLfloat squareVertices[] = {
-0.5f, -0.33f,
0.5f, -0.33f,
-0.5f, 0.33f,
0.5f, 0.33f,
};
//描画する色データを宣言
static const GLubyte squareColors[] = {
255, 255, 0, 255,
0, 255, 255, 255,
0, 0, 0, 0,
255, 0, 255, 255,
};

static float transY = 0.0f;

// This application only creates a single context which is already set current at this point.
// This call is redundant, but needed if dealing with multiple contexts.
[EAGLContext setCurrentContext:context];

// This application only creates a single default framebuffer which is already bound at this point.
// This call is redundant, but needed if dealing with multiple framebuffers.
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//座標を設定できる。下記記述「座標の話」
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//ポリゴンを上下に動かしている
glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f);
transY += 0.075f;

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

//ポリゴンを描画している。
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// This application only creates a single color renderbuffer which is already bound at this point.
// This call is redundant, but needed if dealing with multiple renderbuffers.

//描画したものを実際の画面上に表示させている。
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
[/cc]

座標の話


OpenGLは独自の座標系が適応されています。
初期状態では左上が(-1.0,1.0)で右下(1.0,-1.0)となっています。この座標をどのような値に設定するかはglOrthof()を使って設定できます。
[cc lang=”c”]
glOrthof(左端のX、右端のX、下のY、上のY、手前のZ、奥のZ);
//例
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrthof(0.0f,320.0f,480.0f,0.0f,0.5f,0.5f);
[/cc]

ポリゴン

glVertexPointer()
引数1:頂点のデータのサイズを表しています。2Dの場合はx,y座標だけなので「2」になります。
引数2:データの型を指定。
引数3:オフセット値。通常は0
引数4:頂点を指定した配列を指定。

glEnableClientState(GL_VERTEX_ARRAY);
頂点座標を配列にセットしたことをOpenGLに伝えています。

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
引数1でポリゴンの描画のルールを設定できます。
  • GL_TRIANGLE_STRIP:

  • GL_TRIANGLES

  • GL_LINES

引数3は頂点の数です。

[cc lang=”c”]

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
[/cc]

ライブラリを作成

一々コードを書いているのは非効率ですし、面倒くさいので汎用的な関数はライブラリにまとめておきました。
  • 「other sources」に新しくライブラリを作る。object-c++というファイル名で指定。
  •  新しく作った「.mm」に関数を記載。ライブラリを作る
  •  「ES1Renderer.h」に新しく作ったライブラリを呼び出し、「ES1Renderer.mm」に関数を設置する。

円を表示する


頂点配列の大きさを決める。
GLfloat vertices[n* 3* 2];
n:正n角形のn
3;頂点の数。三角形なので3
2 ;配列の数。2Dの場合はx、yだけなので2

色の指定

glColor4ud(赤、緑、青、アルファ);
glDisableClientState(GL_COLOR_ARRAY);

今までのように配列で指定するのではなく「glColor4ud」を使っています。この場合はGL_COLOR_ARRAYを無効にしなくては行けないので、glDisableClientStateでその処理を行っています。

アルファを有効にする

今までの例では引数にalphaを指定していましたが、値を変えても変化をしていません
以下のような設定をして有効にしてやらなくてはいけません。
[cc lang=”c”]
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
drawCircle();
glDisable(GL_BLEND);
[/cc]



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



[エラー]
「error: stray ‘\343’ in program」全角の空白がないかどうかでエラーになるみたいです。
「was not declared in this scope」大文字、小文字で関数が違っている場合。

Related Posts Plugin for WordPress, Blogger...