0

Android で OGLES をいじってみましょう。いくつかの三角形を作成して翻訳したいと思います。簡単です。

例を見て、Android で GLES を使用するポリゴン座標の格納構造として FloatBuffers が推奨されていることがわかりました。いい物!ここで説明。

float[] ではなく FloatBuffer を使用する理由

今私を混乱させているのは、Android の Matrix クラスが Java float 配列でほぼ排他的に動作することです。一方で、スピードのために FloatBuffers を使用するように言われていますが、一方で、私がやりたいすべての変換は、このように見える必要がありますか?

float[] myJavaFloatArray = new float[polylength];
myFloatBuffer.get(myJavaFloatArray);
Matrix.translateM(myJavaFloatArray,0,-1.0f,0.0f,0.0f);
myFloatBuffer.put(myJavaFloatArray);

これは本当にベストプラクティスですか?引き分けに換算する私の比率が十分に低く、この費用に見合う価値があるという仮定だけですか? フレームごとにすべてのオブジェクトに 1 つずつ、多数の変換を行っている場合、それは Java float 配列を全体で使用するための引数ですか?

4

1 に答える 1

1

まず、バッファデータを直接指す値を返すメソッドarray()はありませんか? メモリの周りにデータをコピーしないように、translate メソッドでそれを使用する必要があります。これにより、4 行のコードが 1 行に変換されます。FloatBufferfloat[]

Matrix.translateM(myFloatBuffer.array(),0,-1.0f,0.0f,0.0f);

次に、CPU で頂点データを変換することはベスト プラクティスではありません。そのための頂点シェーダーがあります。マトリックスを使用して GPU にプッシュすると、その恩恵を受けることができます。また、これらのデータを自分のやり方で変換すると、データが壊れてしまいます。複数の場所に描画したいオブジェクトの頂点配列がフロート バッファに含まれている場合は、新しい場所に変換する前に、それを 0 に戻す必要があります。描画呼び出しごとに、または頂点データの複数のインスタンスを持ちます。

いずれにせよ、配列バッファを変換できると非常に便利ですが、可能であればフレームごとに使用することは避けてください。ロード時または要素を準備するときのバックグラウンドで実行します。フレームごとについては、むしろそのために頂点シェーダーを使用してみてください。ES1 を扱っていて、頂点シェーダーがない場合でも、同じように機能するマトリックス操作があります (移動、回転、スケーリング、設定、プッシュ、ポップ...)。

于 2013-06-21T06:47:57.260 に答える