2011-07-15 3 views
2

私はGDC 2011でGoogleが行った方法で、未圧縮の未圧縮VBOデータを読み込もうとしました。このメソッドはMappedByteBufferを使って、その後のglBufferDataの呼び出し残念ながら、私のためには、それは機能していないだけです。私はそれのためのハッキーな仕事を見つけることができました(私のコードでコメントしました)が、私はこのハックなしで動作するようにしたいと思います。ここに私のコードのサンプルです:あなたのポストから経過生のVBOデータをMappedByteBuffer経由でOpenGLにロードする(動作していない)

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); 
+0

同じ問題があります。私はサンプルコードが実際にすべてのデバイス/実装で動作するとは思わない。 – HRJ

+0

ええ、この時点で、私はそれに同意します。 FWIW、私の "ハック"はまだInputStreamを使うよりも速いです。このコードセクションはかなり大きなメッシュデータに対して何度も実行され、目に見えるスローダウンを引き起こすものではありません。 – user8709

答えて

1

二年には、これはVBOへれるMappedByteBufferとのデータの読み込みに関するスタックオーバーフロー上の唯一のエントリであると私は解決策を見つけたと思います。

私の意見では、このコードではなく、ロードしようとしているデータが問題です。私の場合は、格納された頂点データのエンディアンをリトルエンディアンに変更したときに役立ちました。

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

+1

これを試す必要があります...元の問題の解決策は見つかりませんでした。多分これはそれです! – user8709

+0

'ByteBuffer#asFloatBuffer'経由でfloatで書かれた' ByteBuffer'のエンディアンと同様の問題のため、聖なる煙草、時間は消えました!= 'glBufferData'に渡されるときに' FloatBuffer'のエンディアン。なんて恐ろしい気持ち。 – nmr

関連する問題