2012-04-19 17 views
3

これはWebGL固有の質問です。私はdrawElementsのWebGL固有の実装を理解するのに問題があります。ここにAPI仕様があります。 From the WebGL specificationWebGL drawElementsのオフセットはどのように使用しますか?

どのように正確にオフセットを使用しますか?より古典的なglDrawRangeElementsを模倣するためにオフセットを使用できますか?

無効drawElements(GLenumモード、GLsizeiカウント、GLenumタイプ、オフセットGLintptr) (のOpenGL ES 2.0§2.8、manページ)

現在バインドされている要素の配列バッファを使用して描画します。指定されたオフセットはバイト単位であり、指定された型の有効な倍数でなければならないか、INVALID_OPERATIONエラーが生成されます。 「バッファのオフセットとストライドの要件」を参照してください。 countが0より大きい場合は、null以外のWebGLBufferをELEMENT_ARRAY_BUFFERバインディングポイントにバインドする必要があります。そうしないと、INVALID_OPERATIONエラーが生成されます。

私はフラット頂点配列とフラットなインデックスの配列を持ち、1つのdrawElementsコールを使用して描画することは偉大なワークアウトが、今私は、彼らが別のオブジェクトであるため、個別の頂点の部分を描きたいされています。例えば、インデックス[0]からインデックス[99]は1つのオブジェクト(例えば、腕)であり、インデックス[100]からインデックス[149](例えば脚)は別のオブジェクトである。グループは別々に描画する必要があります。最終的にはテクスチャが異なるため、drawElementsを呼び出す前にテクスチャをバインドします。

したがって、drawElementsをインデックス[ 0]をインデックス[99]に、インデックス[100]をインデックス[149]に描画します。 drawElementsオフセットでそれを行うことはできますか?

私がここに書いたコードでは、最初のグループを非常にうまく描くことができますが、残りのグループは表示されません。

for(var g = 0; g < groups.length; g++) { 
    var group = groups[g]; 

    //Set the texture 
    var material = group.material; 
    material.bindTexture(); 

    //Draw it! 
    var offset = group.offset; //index of the first element of the indices, (e.g. position '0' or position '100', from above) 
    var num_items = group.num_items; //number of items in this group, (e.g. '100' elements or '50' elements, from above) 
    gl.drawElements(draw_mode, num_items, indices.type, offset); 
} 

答えて

3

ドキュメントは言う:

...バイト単位で指定したオフセット、およびサイズ指定されたタイプの の有効倍数でなければなりません...

の場合indices.typegl.UNSIGNED_SHORTの場合、各インデックスに2バイトが使用されています。

offset * 2だけではなくoffsetを使用してみてください:

gl.drawElements(draw_mode, num_items, indices.type, offset * 2); 
+0

完璧に働いたこと。ありがとう、フアン!私はまだStackOverflowの新しさです。 =) – SharkCop