2016-08-19 8 views
2

はのは、私は頂点の配列とVBOポインタを持っているとしましょう:OpenGL:VBOにバッファリングした後でもまだ頂点の配列が必要ですか?

std::vector<Vertex> vertices; 
GLuint vbo; 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

今、私はデータをバッファリング:

glBufferData(
    GL_ARRAY_BUFFER, 
    vertices.size()*sizeof(Vertex), 
    &vertices[0], 
    GL_STATIC_DRAW 
); 

私はこれを正しく理解していれば、私はまだ起因する頂点の配列を維持する必要がありますGL_STATIC_DRAW。しかし、それをGL_STATIC_COPYに変更すると、すべてのデータがGPUのメモリにコピーされ、verticesで使用されるメモリを解放できます。あれは正しいですか?その場合、なぜ*_DRAWが必要ですか?それはGPUのメモリ制限のために役立つのですか?プラスGL_STATIC_READはどのように実際に動作しますか?

答えて

6

このすべてについては、glBufferData()マニュアルページで説明しています。

https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

あなたはあなたのプログラムのメモリ内の余分なコピーを保持する必要はありません。 glBufferData()の全目的は、プログラムからOpenGLバッファにデータをコピーすることです。コピーが完了したら、プログラムメモリで何でもできます。

データがNULLでない場合、データストアはこのポインタからのデータで初期化されます。

GL_STATIC_COPYを使用しないでください。これは間違っています。ドキュメントを読み取り:

COPY

データ・ストアの内容がGLからデータを読み出すことによって修飾し、GL描画と画像特定コマンドのソースとして使用されます。

したがってGL_STATIC_COPYは、異なるOpenGLバッファ間の内部コピー用であり、アプリケーションからOpenGLへのコピー用ではありません。 DRAWを使用してください。

関連する問題