Tôi hiện đang sử dụng các lớp GLTools đi kèm với ấn bản Superbible 5th. Tôi đang tìm trong lớp GLTriangleBatch và nó có đoạn mã sau:Đối tượng đệm OpenGL Vertex, tôi có thể truy cập dữ liệu đỉnh cho các mục đích khác như phát hiện va chạm không?
// 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;
Từ những gì tôi hiểu mã vượt qua mảng mà các con trỏ pVerts, pNorms, pTexCoords, pIndexes và lưu trữ chúng trong một đối tượng mảng Vertex, về cơ bản là một mảng các đối tượng đệm đỉnh. Chúng được lưu trữ trong bộ nhớ trên GPU. Các con trỏ ban đầu sau đó sẽ bị xóa.
Tôi quan tâm đến việc truy cập các vị trí đỉnh, được giữ trong mảng pVert được trỏ tới.
Bây giờ câu hỏi của tôi xoay quanh phát hiện va chạm. Tôi muốn có thể truy cập vào một mảng của tất cả các đỉnh của GLTriangleBatch của tôi. Tôi có thể lấy chúng qua số vertexBufferObject
sau này bằng cách sử dụng một số loại phương thức getter? Nó sẽ là tốt nhất để chỉ giữ con trỏ pVerts xung quanh và sử dụng một phương thức getter cho rằng thay vào đó? Tôi đang suy nghĩ về hiệu suất, vì tôi hy vọng sẽ triển khai thuật toán phát hiện va chạm GJK trong tương lai ...
Cảm ơn bạn! Câu trả lời đó rất hữu ích! Tôi sẽ giữ con trỏ pVert xung quanh để truy cập dữ liệu đỉnh sau này. – kbirk
@ user785259: Chỉ giữ con trỏ không đủ. Bạn thực sự phải giữ bộ nhớ được cấp phát, tức là không phải 'xóa []' hoặc 'miễn phí (...)' nó. Ngay cả sau khi giải phóng bộ nhớ bạn vẫn có thể có con trỏ trong C, mà sau đó là không hợp lệ. Có lẽ bạn đang đến từ một ngôn ngữ thu gom rác thải, sau đó loại bỏ một con trỏ thực sự ngụ ý giải phóng bộ nhớ, và có, đây là ngữ nghĩa sane. Nhưng đây là C++ bạn đang đối phó với và tất cả việc này là một sự cần thiết không thể tránh khỏi ở đó. – datenwolf