私はAndroid上でOpenGLを学び始めています。glTexCoordPointer(...)やglVertexPointer(...など) )、glDrawTexvOES()、glTexParameteriv()などのその他のものはBufferオブジェクトでのみ受け入れ、float []も受け入れます。なぜ、いくつかのgl呼び出しは、他の受け入れ中だけの間に受け入れますか?
なぜ私は不思議ですか? :)
私はAndroid上でOpenGLを学び始めています。glTexCoordPointer(...)やglVertexPointer(...など) )、glDrawTexvOES()、glTexParameteriv()などのその他のものはBufferオブジェクトでのみ受け入れ、float []も受け入れます。なぜ、いくつかのgl呼び出しは、他の受け入れ中だけの間に受け入れますか?
なぜ私は不思議ですか? :)
基本的な違いは、glTexCoordPointerとglVertexPointer関数への入力はすぐには使用されないということです。 glDrawArrays、glDrawElements。
アレイはすぐには使用されないため、これらの関数に送信される配列へのポインタは、描画ルーチンがアクセスするのに十分な長さを保つ必要があります。データはネイティブヒープ上になければなりません。そうしないと、データが削除されていなくてもガベージコレクタは元のネイティブポインタを移動できます。ネイティブヒープ上のポインタを取得するには、Bufferオブジェクト内にデータをラップする必要があります。
glTexParameterivのような関数は、すぐに渡す配列の値を使用するため、呼び出された関数の下からポインタが移動する心配がなく、ネイティブヒープ上にポインタを置く必要はありません。
glTexCoordPointerとネイティブコードのフレンドを使用している場合は、glDraw関数を呼び出した後まで、送信するポインタを保持する必要があります。ネイティブコードでは、ポインタをオブジェクトにラップする必要はありませんが、手動でヒープ割り当てを管理する必要があるという欠点があります。
素晴らしい!有益な説明をありがとう! – dimsuz