iOS開発とOpenGL ES関連問題整理(1)
自己転載:http://www.bennychen.cn/2011/05/ios開発とopengl-esに関する問題整理(1)/
ごく限られた平日の夜と週末にはiOS上のゲームプログラミンの研究が行われていますが、進行は非常に遅いです.
OpenGL ESが関数’glMatrixMode’で崩壊したのは、OpenGL ES 2のcontextでOpenGL ES 1の関数を使用しています.ES 1は固定関数レンダリングパイプラインです.ES 2はプログラム可能なレンダリングパイプラインです.ですから、ES 2がこれらのサポートされていないES 1関数に出会うと、あなたのプログラムは'EXC_'を受け取ります.BADACCESS’メッセージは、崩壊します.gdbでcalstackを調べて、最後の関数がgli Uniimplemenedであることを示します.
OpenGL ESが描画関数’glDrawArays’に崩壊したのは、GLのあるレンダリング状態(例えば、vertex、カラー、texture coordinateなど、ここですの可能な状態のリスト)を起動したからかもしれませんが、描画関数(例えば、’glDrawAray’)が行われる前に、この状態に対応するデータポインタを設定していません.例えば:
view source
print
?
ごく限られた平日の夜と週末にはiOS上のゲームプログラミンの研究が行われていますが、進行は非常に遅いです.
OpenGL ESが関数’glMatrixMode’で崩壊したのは、OpenGL ES 2のcontextでOpenGL ES 1の関数を使用しています.ES 1は固定関数レンダリングパイプラインです.ES 2はプログラム可能なレンダリングパイプラインです.ですから、ES 2がこれらのサポートされていないES 1関数に出会うと、あなたのプログラムは'EXC_'を受け取ります.BADACCESS’メッセージは、崩壊します.gdbでcalstackを調べて、最後の関数がgli Uniimplemenedであることを示します.
1
#0 0x0b05c0e5 in gliUnimplemented ()
2
#1 0x00a1c6c3 in glMatrixMode ()
どうしてもES 1関数を使うなら、ES 1であなたのGL contextを初期化するしかないです.1
EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
関数'pathForResource'はnilに戻り、プロジェクトの'Groups&Files'にリソースファイルを追加する必要があるを返します.OpenGL ESが描画関数’glDrawArays’に崩壊したのは、GLのあるレンダリング状態(例えば、vertex、カラー、texture coordinateなど、ここですの可能な状態のリスト)を起動したからかもしれませんが、描画関数(例えば、’glDrawAray’)が行われる前に、この状態に対応するデータポインタを設定していません.例えば:
1
glEnableClientState( GL_COLOR_ARRAY );
2
glColorPointer( 4, GL_UNSIGNED_BYTE, 0, youColorArray );
上の二つのコードに対して、カラー配列を使っていますが、カラー配列のポインタが設定されていません.本当に描画する時、あなたのプログラムは対応するポインタが見つからなくて崩れます.同様に、「glEnbeleClentState」を呼び出したら、GratexTURREADUARRAYを通して、GlTexCoordPointer()を通してテクスチャ座標の配列ポインタを設定する必要があります.このように類推します.どのようにOpenGL ESを通してピクセル単位で描きますか?スクリーンの比率ではありません.iPhone上でOpenGL ESで2 D描画する場合、デフォルトの原点位置は画面中央にあり、画面の座標範囲は-1から1までとなります.横軸でも縦軸でもかまいません.GLのデフォルトの単位1は、下図のように画面長と幅の半分を表しています.写真はブックから来ました.A Hands-On Gide to Buiilding Your First iPhone Game’は、原点をスクリーン左下の隅に移動したいならば、描画時にピクセル単位で描画したいですが、glOrthof関数を通じて投射マトリックスを垂直投射マトリックスに設定すればいいです.コードは以下の通りです.view source
?
1
glMatrixMode(GL_PROJECTION);
2
glLoadIdentity();
3
glOrthof( 0, framebufferWidth, 0, framebufferHeight, -1, 1 );