1

質問を大幅に変更する以下の編集を参照してください。

オリジナル:

Xcode4.1を使用してiOS4でOpenGLES2.0を使用して要素をレンダリングする際に問題が発生しました。

glDrawElementsを使用すると、問題なく問題なく表示されます。

glDrawElements(GL_TRIANGLES, indicesSizeAll/sizeof(IndicesAll[0]), GL_UNSIGNED_SHORT, 0);

しかし、同等のglDrawRangeElementsを使用すると、さまざまな問題が発生します。

glDrawRangeElements(GL_TRIANGLES, 0, (indicesSizeAll/sizeof(IndicesAll[0]))-1, indicesSizeAll/sizeof(IndicesAll[0]), GL_UNSIGNED_SHORT, 0);

次のビルド警告が表示されます。

Semantic Issue: Implicit declaration of function 'glDrawRangeElements' is invalid in C99

および実行中の次のエラー:

Program received signal: "EXC_BAD_ACCESS"

この関数プロトタイプを含めました:

extern void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);

これはビルド警告を取り除きましたが、まだ実行エラーがあります。

この問題を解決するために何をすべきか本当にわかりません。私は一歩ずつ物事を進めて表示するようにしていますが、今後はglDrawRangeElementsを使用する必要があると考えているので、それを機能させようとしています。誰かが私のためにいくつかのガイダンスを持っていますか?

編集:

それは私の注意を引いた:

DrawRangeElementsはOpenGLES1.1または2.0には存在しないため、システムヘッダーには存在しません。代わりにglDrawElementsを呼び出す必要があります。

これにより、 glDrawRangeElementsで問題が解決すると思っていた以前の状況に戻ることができます。

つまり、各バッファーに異なる回転を適用したいので、すべてをレンダリングするために複数のバッファーを使用する必要があります。

[modelView rotateBy:CC3VectorMake(x, y, z)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

2つの異なるバッファを設定しました。

glGenBuffers(1, &vertexBufferA);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferA);
glBufferData(GL_ARRAY_BUFFER, verticesSizeA, VerticesA, GL_STATIC_DRAW);

glGenBuffers(1, &indexBufferA);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferA);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeA, IndicesA, GL_STATIC_DRAW);
--------------------
glGenBuffers(1, &vertexBufferZ);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferZ);
glBufferData(GL_ARRAY_BUFFER, verticesSizeZ, VerticesZ, GL_STATIC_DRAW);

glGenBuffers(1, &indexBufferZ);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferZ);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeZ, IndicesZ, GL_STATIC_DRAW);

次に、これらの要素をレンダリングする場合:

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferA);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferA);

glDrawElements(GL_TRIANGLES, indicesSizeA/sizeof(IndicesA[0]), GL_UNSIGNED_SHORT, 0);
--------------------
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferZ);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferZ);

glDrawElements(GL_TRIANGLES, indicesSizeZ/sizeof(IndicesZ[0]), GL_UNSIGNED_SHORT, 0);

glDrawElementsを1回呼び出すだけで問題なくレンダリングされますが、バッファーごとに呼び出すと、2回目の呼び出しでのみレンダリングが行われます。

ここで何が欠けているのか正確にはわかりません。私はOpenGL全体に不慣れであり、学習しながら進んでいきます。

ポインタや説明に感謝します。

4

1 に答える 1

1

私は自分の質問に対する答えを見つけました。結局のところ、すべてのデータを1つのバッファーに保存し、レンダリングごとに目的の範囲を指定できます。


頂点バッファとインデックスバッファの設定:2つのグラフィック(AとZ)のデータを含む単一のバッファセット

glGenBuffers(1, &vertexBufferAll);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferAll);
glBufferData(GL_ARRAY_BUFFER, verticesSizeAll, VerticesAll, GL_STATIC_DRAW);

glGenBuffers(1, &indexBufferAll);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferAll);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeAll, IndicesAll, GL_STATIC_DRAW);

頂点配列のデータのオフセットを定義します

glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 0));
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

インデックス配列の指定されたオフセットにある要素を描画します

glDrawElements(GL_TRIANGLES, indicesCountA, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * 0));
glDrawElements(GL_TRIANGLES, indicesCountZ, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * indicesCountA));

各glDrawElementsの前に適切なマトリックスを適用して、目的の回転を実現します

glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

動作するようになったので、それは確かに非常に単純で明白なように見えますが、適切なセットアップに出くわすまで、多くのバリエーションを経験する必要がありました。OpenGLのように感じますが、100%正しくない場合は、正しくありません。

于 2012-09-03T19:56:07.023 に答える