0

OpenGlESは初めてです。マニュアルやチュートリアルを使わずに球体を作ろうとしています...

私は自分の目標を達成することに成功しました。TRIANGLE_STRIPを使用して球を描くことができます。そして、描画する前に指定した子午線/水平線の数。

頂点のインデックスが256未満の場合は、すべて正常に機能します。GLubyteの代わりにGLushortを使おうとしましたが、画像が大きく変わりました。

GLubyte *Indices;
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * (meridians * (horizontals * 2 + 2)), Indices, GL_STATIC_DRAW);
...
Indices = malloc(sizeof(GLubyte) * (meridians * (horizontals * 2 + 2)));

ここで、バイトをshortに変更します。

GitHubの現在のプロジェクト

私は何をすべきか?

これが私がバイトをショートに変更した写真です

GLushort GLubyte

4

1 に答える 1

4

次の行を変更するのを忘れたようです。

glDrawElements(GL_TRIANGLE_STRIP, (meridians * (horizontals * 2 + 2)), GL_UNSIGNED_BYTE, 0);

これは、レンダリングするインデックスがいくつかあり、それぞれが符号なしバイトのサイズであることを示しています(ほとんどの場合、8ビットですが、実際の数はプラットフォーム固有です...非常にまれですが、8ビットではありません) 。ただし、unsigned shorts(おそらく16ビット)のサイズのインデックスの配列を埋めたので、最終的には、各数値が2回読み取られます。1回は「最初の」8ビットで、もう1回は「2番目」です(エンディアンは上位または下位のどちらが最初に来るかを決定します)。多くのインデックス(大部分?)が255未満であるため、上位8ビットがすべて0であるため、「0」に変わる頂点が多数あります。さらに、レンダリングするのは半分だけです。あなたのインデックスの。

したがって、上記の行を次のように変更する代わりに、これらのインデックスを符号なしショートとして描画する必要があることをOpenGLに示す必要があります。

glDrawElements(GL_TRIANGLE_STRIP, (meridians * (horizontals * 2 + 2)), GL_UNSIGNED_SHORT, 0);

于 2012-12-04T08:35:01.417 に答える