2010-12-10 12 views
5

iPad上に65536を超える頂点を持つ3Dオブジェクトを描画しようとしていますが、間違っていることを理解できません。 GL_UNSIGNED_SHORTを使用していた私の元のモデルはうまくいきましたが、GL_UNSIGNED_INTではglDrawElementsコマンドを使って何も表示できません。レンダラーがglDrawElements行を完全に無視しているようです。私が参照してる私のレンダリングループの一部は以下の通りです:インデックスにGL_UNSIGNED_INTを使用して、どのようにglDrawElementsを使用しますか?

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

glVertexPointer(3, GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]); 
glNormalPointer(GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]); 

for (int i = 0; i < assemblyObj->numObjects; i++) 
{ 
    glDrawElements(GL_TRIANGLES, assemblyObj->partList[i].faceArray.size(), GL_UNSIGNED_INT, &assemblyObj->partList[i].faceArray[0]); 
} 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

頂点として定義されています

vector<float> vertices; 

と各faceArrayは以下のように定義されています上の任意の提案

vector<UInt32> faceArray; 

ジオメトリが描画されないように間違っているのは何ですか?

答えて

7

在庫OpenGL ESはインデックスのためにGL_UNSIGNED_INTをサポートしていません。 GLES glDrawElements man pageから

:タイプがGL_UNSIGNED_BYTEかGL_UNSIGNED_SHORTない場合

GL_INVALID_ENUMが生成されます。

この制限は、GL_OES_element_index_uintがサポートされている場合に緩和されます。

ターゲットプラットフォームでサポートされていない場合は、メッシュを< 64Kのインデックスで複数のサブメッシュに追加することをお勧めします。

具体的には、わかっている限り、iOS does not support this extension(サポートされている拡張機能を参照してください)。ただし、確認したい場合は実際のデバイスの拡張子リストを確認できます。

+0

これは、glDrawArraysで描画するよりも高速ですか?私は今glDrawArraysでやっていることと同じことをすることができますが、可能な限り多くのFPSでレンダリングしたいと思います。 – Davido

+0

私はそれを理解した、私はちょうどそれが独自の頂点配列を使用して各オブジェクトをレンダリングし、それはうまく動作します。私は合計90個のモデルで約125,000個の頂点をレンダリングしています。これは使用可能で、毎秒約12フレームをレンダリングします。今はレンダリングを高速化するためにできることがあるかどうかを判断しようとしています。助言がありますか? – Davido

+3

この回答は間違っています.GL_UNSIGNED_INTは、GL_OES_element_index_uintが実装されている場合(これはに従ってiOSにあります)、 'glDrawElements'に対してサポートされています。 –

関連する問題