2

Google が GDC 2011 で行った講演で提示された方法を使用して、圧縮されていない未加工の VBO データをロードしようとしました。残念ながら、私にとってはうまくいきません。そのためのハックな回避策を見つけることができました(以下のコードでコメントアウトされています)が、そのハックなしでこれを機能させたいと思います。これが私のコードのサンプルです:

FileInputStream fis = new FileInputStream(new File(location));
FileChannel fc = fis.getChannel();
MappedByteBuffer mbb = fc.map(MapMode.READ_ONLY, 0, fc.size());

// Hackery because passing mbb to glBufferData isn't working. 
//FloatBuffer fb = mbb.asFloatBuffer();
//float triangles[] = new float[fb.capacity()];
//for(int i = 0; i < triangles.length; i++) {
//    triangles[i] = fb.get(i);
//}
//fb = FloatBuffer.wrap(triangles);

bufferInfo = new int[3];
bufferInfo[0] = newBufferID();
int size = (int)fc.size();

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferInfo[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, size, mbb, GLES20.GL_STATIC_DRAW);
4

1 に答える 1

1

あなたの投稿から 2 年が経過しましたが、MappedByteBuffer と VBO へのデータの読み込みに関する Stack Overflow の唯一のエントリであり、解決策を見つけたと思います。

私の意見では、問題はこのコードではなく、読み込もうとしているデータにあります。私の場合、保存された頂点データのエンディアンをリトルエンディアンに変更したときに役立ちました。

これは、提供された例で Google が行っているのと同じです。ポイントは sphere.c を使用して生成されるため、プログラムを実行すると値がリトル エンディアンで取得され、それがデモが機能する理由です。DataOutputStream を使用して Java から値を格納しようとすると、ビッグ エンディアンの順序になりました。

于 2013-09-20T20:32:32.143 に答える