5

これは WebGL 固有の質問です。drawElements の WebGL 固有の実装を理解できません。API仕様はこちら。WebGL 仕様から

オフセットを正確に使用するにはどうすればよいですか? オフセットを使用して、より古典的な glDrawRangeElements を模倣できますか?

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

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

フラットな頂点配列とフラットなインデックス配列があり、1 回の drawElements 呼び出しを使用した描画はうまくいきましたが、頂点の一部は別のオブジェクトであるため、個別に描画したいと考えています。たとえば、index[0] から index[99] までは 1 つのオブジェクト (腕など) であり、indexs[100] から index[149] まで (脚など) は別のオブジェクトです。グループは個別に描画する必要があります - 最終的にはテクスチャが異なるため、各 drawElements 呼び出しの前にテクスチャをバインドします (これを完全に行う別の方法があるかもしれません)。

したがって、インデックス [0] の drawElements をインデックス [99] に呼び出し、インデックス [100] の drawElements をインデックス [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);
}
4

1 に答える 1

7

ドキュメントには次のように記載されています。

...指定されたオフセットはバイト単位であり、指定された型のサイズの有効な倍数でなければなりません...

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

offset * 2代わりに使用してみてくださいoffset

gl.drawElements(draw_mode, num_items, indices.type, offset * 2);
于 2012-04-19T08:20:49.160 に答える