2010-12-26 33 views
3

iOSでOpenGL ES 2.0を使用する方法を学習しています。今は、基本的な2Dアニメーション(たとえば、画面の周りを四角形を移動してサイズを変更するなど)を行うだけです。私はXcodeのAppleが提供するOpenGL ESのプロジェクトテンプレートを使い始めました。OpenGL ES 2.0での2D描画(iOS)

static GLfloat squareVertices[] = { 
    -0.5f, -0.33f, 
    0.5f, -0.33f, 
    -0.5f, 0.33f, 
    0.5f, 0.33f 
}; 

// Update attribute values. 
glVertexAttribPointer(VERTEX_ATTR, 2, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(VERTEX_ATTR); 

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors); 
glEnableVertexAttribArray(COLOR_ATTR); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); 

さて、これは画面の中央にnice rectangleを描画します:私の描画コードは次のようになります。私は、次のコードを追加して矩形を変更し始めた場合でも、それはlook funkyに開始します:

squareVertices[5] -= .001; 
squareVertices[7] -= .001; 

長方形の一部が画面の中央に装着されているかのようです。私はOpenGL ESについて全く新しいので、私の問題は明らかであると確信しています。また、これは3DグラフィックスライブラリであるOpenGL ESと関係があり、2D空間として扱おうとしていると考えています。だから私の質問は:OpenGL ES 2.0で2Dオブジェクトを描き、アニメーション化する最良の方法は何ですか?私はOpenGL ES 1.1用にいくつかのものをオンラインで見たことがありますが、それはあまり役に立ちません。 OpenGL ES 2.0での2D描画のための特別なテクニックですか?または2D描画モードがありますか?

ご指摘いただければ幸いです。

答えて

6

@ macinjosh:これは、回答に興味のある人のための最新の質問に対する回答です。あなたが投稿した12月10日以来、あなたはさらなる知識を得ていると思います!

OpenGLの頂点は2Dではなく3Dです。完全に誠実であるために、実際には4Dに 'w'コンポーネントも含まれているので、今のところ、同値のベクトルのような値1.0として考慮してください。

3Dのため、シェーダに 'z'コンポーネントを追加しない限り、頂点属性として1つを指定する必要があります。

1

Iの周りにいくつかの演奏はこれに描画コードを変更した後:

static GLfloat squareVertices[12] = { 
    -0.5f, -0.33f, 0.0, 
    0.5f, -0.33f, 0.0, 
    -0.5f, 0.33f, 0.0, 
    0.5f, 0.33f, 0.0 
}; 

// Update attribute values. 
glVertexAttribPointer(VERTEX_ATTR, 3, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(VERTEX_ATTR); 

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors); 
glEnableVertexAttribArray(COLOR_ATTR); 

squareVertices[7] -= .001; 
squareVertices[10] -= .001; 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

各頂点に第0.0フロートの追加は、トリックを行うように見えました。私はそれがなぜあるのか不明であるので、誰かが何らかの光を放つことができるなら、私はそれを評価するだろう。

2

私はOpenGLで新しくなっていますが、頂点は3つの浮動小数点を必要とせず、各ax:X、Y、Z?

ので、最初の頂点配列は次のようになります。

(-0.50f, -0.33f, 0.50f) 
(-0.33f, -0.50f, 0.33f) 
( 0.50f, 0.33f, ?????) 

秒は次のようになります。

(-0.50f, -0.33f, 0.00f) 
( 0.50f, -0.33f, 0.00f) 
(-0.50f, 0.33f, 0.00f) 
( 0.50f, 0.33f, 0.00f) 

私は本当に初心者ですので、あまりにも真剣に私を取ることはありません... :)

ところで、これは私が見つけたのOpenGLについての知識の最もよい源でありますこの答えは、理にかなっている

希望...

+1

そのブログは素晴らしいですが、そのシリーズは4章以降に終了します。私は彼が停止したことを認識したとき、私は本当にうんざりしていた:( – xaxxon

2

あなたはglVertexAttribPointerの三番目のパラメータとして「3」を持っているので。私はあなたが2にそれを設定することができると信じていますが、私はGLでこれを試していません。私の推測では、欠落しているz軸は内部的に '0'として埋められます(しかし、もう一度試してみてください!)。内部的には、おそらくすべて4つの浮動小数点ベクトルとなり、均質な行列乗算ガボンに使用される第4( 'w')パラメータを持つことになります。

モバイルデバイスでこれを実行している場合は、固定小数点演算(浮動小数点のco-proを持たないデバイスでは高速)と、より多くの頂点バッファオブジェクト多くのマシンで効率的です。また、

glInterleavedArrays(format_code, stride, data) 

で使用されるような一定の頂点フォーマットは、デバイスは、あなたが一緒に行くことにしたものは何でも「format_code」のコードパスを最適化したかもしれないように、より効率的になるかもしれません。

関連する問題