ここInterleavedBufferクラスでは、ストライドのデフォルト値を0にすることをお勧めします。 ユーザーがストライドを指定するのを忘れた場合、 this.stride
の値undefined
になり、これはvar stride = data.stride;
にカスケードされ、さらに_gl.vertexAttribPointer
にカスケードされて未定義のwebgl動作が発生します。
引数にデフォルト値を設定するということは、値をまったく指定しなくてもよいということです。 ただし、この場合は値を設定する必要があります。
また、ゼロがデフォルトの場合、次の行はゼロで除算できます。
three.jsは通常、パラメーター値をチェックしません。
残念ながら、C ++とは異なり、コンパイル時に検出されるため、ユーザーにその値を設定させる方法はありません。 設定する必要がある場合は、設定されていない場合にエラーをスローして、サイレントに通過して奇妙なグラフィック動作を返すのではないでしょうか。 three.jsの新しいユーザーとして、私は問題を見つけるのにかなりの時間を無駄にしました、そして私はこの落とし穴に陥る唯一の人ではないと確信しています。
ユーザーが0をstride
に割り当てるのを防ぐ方法はありません。これにより、前述の@WestLangleyでゼロ除算の問題が発生します。
ここでのAPIドキュメントは、 stride
の意味を明確に説明していません。 OpenGL / WebGL APIでの私の経験に基づくと、ここでのstride
は、頂点属性のプリミティブ要素(floatまたはint)の数です。 したがって、 count
は、最初の引数array
で属性が定義されている頂点の数のようです。
そして、私が間違っている場合は訂正してください。 this.count
は、 WebGLRender全体で使用法を検出しませんが、 stride
は重要なGL呼び出し_gl.vertexAttribPointer
で使用されています。 stride
0を割り当てた後、正確には正しくなく、 this.count
がInfinity
になった後、レンダリングが通常に戻る理由も説明しています。フレームワークのどこに。
したがって、 stride
の値を確認し、 undefined
または0
の場合はユーザーにプロンプトを表示するように、セーフガードを設定することをお勧めします。
はい、これはJavaScriptであり、以前にこれらの議論を行ったことがあります。
一方、ドキュメントが不十分または不正確であると感じた場合は、ドキュメントを改善するのに役立つ絶好の機会です。 :)
参照したコードでは、 count
は頂点の数です。 このプロパティは、レンダラーによって使用される場合と使用されない場合がありますが、必要に応じてアプリケーション層で使用できるプロパティです。
最も参考になるコメント
引数にデフォルト値を設定するということは、値をまったく指定しなくてもよいということです。 ただし、この場合は値を設定する必要があります。
また、ゼロがデフォルトの場合、次の行はゼロで除算できます。
three.jsは通常、パラメーター値をチェックしません。