मैं वर्तमान में जीएलटूल कक्षाओं का उपयोग कर रहा हूं जो सुपरबेल 5 वें संस्करण के साथ आते हैं। मैं GLTriangleBatch कक्षा में देख रहा हूँ और यह निम्नलिखित कोड है:ओपनजीएल वेरटेक्स बफर ऑब्जेक्ट, क्या मैं टक्कर का पता लगाने जैसे अन्य उपयोगों के लिए वर्टेक्स डेटा तक पहुंच सकता हूं?
// 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;
मैं क्या समझ कोड सरणियों गुजरता से कि संकेत pVerts, pNorms, pTexCoords, pIndexes और एक शीर्ष सरणी वस्तु में दुकानों उन्हें, जो अनिवार्य रूप से vertex बफर वस्तुओं की एक सरणी है। ये GPU पर स्मृति में संग्रहीत हैं। मूल पॉइंटर्स को हटा दिया जाता है।
मुझे वर्टेक्स पदों तक पहुंचने में दिलचस्पी है, जो सरणी पीवीर्ट में आयोजित की गई थीं।
अब मेरा प्रश्न टकराव का पता लगाने के आसपास घूमता है। मैं अपने GLTriangleBatch के सभी शीर्षकों की एक सरणी तक पहुंचने में सक्षम होना चाहता हूं। क्या मैं उन्हें बाद में vertexBufferObject
के माध्यम से किसी प्रकार की गेटर विधि का उपयोग कर प्राप्त कर सकता हूं? क्या केवल पीवीर्ट्स पॉइंटर को चारों ओर रखना और इसके बजाय गेटटर विधि का उपयोग करना सबसे अच्छा होगा? मैं, प्रदर्शन के मामले में सोच रहा हूँ के रूप में मैं भविष्य में एक GJK टक्कर पता लगाने एल्गोरिथ्म लागू करने के लिए आशा है कि ...
धन्यवाद! वह प्रतिक्रिया बहुत उपयोगी थी! मैं बाद में कशेरुक डेटा तक पहुंचने के लिए पीवीर्ट पॉइंटर को रखूंगा। – kbirk
@ user785259: केवल पॉइंटर रखना पर्याप्त नहीं है। आपको वास्तव में आवंटित स्मृति को अवश्य रखना चाहिए, यानी 'हटाएं [] 'या' मुक्त (...) 'नहीं। स्मृति जारी करने के बाद भी आपके पास सी में सूचक हो सकता है, जो तब अमान्य है। हो सकता है कि आप एक कचरा एकत्रित भाषा से आ रहे हैं, फिर एक पॉइंटर को छोड़कर वास्तव में स्मृति जारी करने का तात्पर्य है, और हां, यह सैवे अर्थपूर्ण है। लेकिन यह सी ++ है जिसके साथ आप काम कर रहे हैं और यह सब नाइटपिकिंग एक अपरिहार्य आवश्यकता है। – datenwolf