私は現在、Superbible第5版に付属のGLToolsクラスを使用しています。 、私は、コードはポインタpVerts、pNorms、pTexCoords、pIndexes配列を渡し、頂点配列オブジェクトに格納し理解して何からOpenGL頂点バッファオブジェクト、衝突検出などの他の用途のために頂点データにアクセスできますか?
// Create the master vertex array object
glGenVertexArrays(1, &vertexArrayBufferObject);
glBindVertexArray(vertexArrayBufferObject);
// Create the buffer objects
glGenBuffers(4, bufferObjects);
#define VERTEX_DATA 0
#define NORMAL_DATA 1
#define TEXTURE_DATA 2
#define INDEX_DATA 3
// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_VERTEX);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pVerts, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_NORMAL);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_TEXTURE0);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_TEXTURE0, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Indexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*nNumIndexes, pIndexes, GL_STATIC_DRAW);
// Done
glBindVertexArray(0);
// Free older, larger arrays
delete [] pIndexes;
delete [] pVerts;
delete [] pNorms;
delete [] pTexCoords;
// Reasign pointers so they are marked as unused
pIndexes = NULL;
pVerts = NULL;
pNorms = NULL;
pTexCoords = NULL;
:私はGLTriangleBatchクラスで探していますし、それが次のコードを持っています本質的に頂点バッファオブジェクトの配列である。これらはGPUのメモリに保存されます。その後、元のポインタは削除されます。
pVertが指し示す配列に保持されていた頂点の位置にアクセスすることに興味があります。
ここで私の質問は衝突検出を中心に展開されています。 GLTriangleBatchのすべての頂点の配列にアクセスできるようにしたい。後で何らかのゲッターメソッドを使用してvertexBufferObject
から取得できますか? pVertsのポインタを保持し、その代わりにゲッターメソッドを使用するのが最善でしょうか?私は将来のGJK衝突検出アルゴリズムを実装したいと思っているので、パフォーマンスに関して考えています。
ありがとうございました!その反応はとても役に立ちました! pVertポインタを後で頂点データにアクセスするようにします。 – kbirk
@ user785259:ポインタを保持するだけでは十分ではありません。実際には、 'delete []'や 'free(...) 'ではなく、メモリを確保しておく必要があります。メモリを解放した後でも、ポインタはC内に残っている可能性があります。これは無効です。たぶんあなたはガベージコレクション言語から来ているでしょう、そして、ポインタを破棄することは、実際にメモリを解放することを意味します。そして、はい、これは正気な意味です。しかし、これはあなたが扱っているC++であり、このすべてのニックピッキングは避けられない必要性です。 – datenwolf