3

Android 用の Rajawali ライブラリを使用して、シーンにいくつかの基本的な 3D オブジェクトを描画しようとしています。サンプルの 2000 プレーンがあり、大量の頂点を 1 つのシェーダーで非常に「安く」レンダリングする方法を示しています。頂点の配列をシェーダーに渡して描画できます。

このサンプルをアップグレードして、いくつかの頂点を個別に移動したいと考えています。

glBufferSubData を試しましたが、シーンで何も変更できません。私が見つけた1つの方法は、データを変更してバッファを再作成することですが、必要なデータのみを変更する簡単な方法があることを願っています.

たとえば、既に作成されバインドされているバッファーからいくつかの位置を変更したいだけです。

位置の初期化

    float[] planePositions = new float[numVertices * 3];
    ....

バッファを作成

    mGeometry.createBuffer(mPlanePositionsBufferInfo, BufferType.FLOAT_BUFFER, mPlanePositions,     GLES20.GL_ARRAY_BUFFER);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

セットポジション

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, planePosBufferHandle);
    GLES20.glEnableVertexAttribArray(maPlanePositionHandle);
    fix.android.opengl.GLES20.glVertexAttribPointer(maPlanePositionHandle, 3, GLES20.GL_FLOAT,
            false, 0, 0);   

たとえば、最初の平面の最初の頂点の位置を変更するにはどうすればよいですか? (planePositions[0] = a;planePositions[1] = b; planePositions[1] = c...そして今、この変更された配列をopenglに渡す必要がありますが、方法がわかりません)。

4

1 に答える 1

3

バッファ データを変更して、PlanesGalore クラスから mGeometry.changeBufferData() を呼び出すだけです。Renderer クラスの onDrawFrame() イベント中に呼び出される更新メソッドに次のコードを追加しました。

for (int i = 0; i < vertices.length; i += 3) {
   mPlanePositions= mPlanePositions.put(i, mPlanePositions.get(i) - 0.01f);
}

mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, 0);

これは、動きを達成するために私が見つけることができる最良の方法です. さらに、私はこの問題で変更を提案しました。これにより、パフォーマンスが向上するはずのバッファーのどの部分が変更されたかを指定できます。

編集

エンジンへの私の変更が承認されたので、これをさらに最適化することができます。

// The offset position should be vertices.length * object #. In my use case this is 72*x
// allowing me to update the XYZ coordinates of all 24 vertices of a cube.
int offsetPosition = 0;
mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, offsetPosition, offsetPosition + vertices.length);
于 2012-09-06T18:17:26.723 に答える