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」大文字、小文字で関数が違っている場合。