OpenGL के वर्टेक्स एरे ऑब्जेक्ट्स का उद्देश्य क्या है?


36

मैंने अभी-अभी ओपनजीएल के साथ शुरुआत की है मैं अभी भी वास्तव में समझ नहीं पाया हूं कि वर्टेक्स एरे ऑब्जेक्ट्स क्या हैं और उन्हें कैसे नियोजित किया जा सकता है।

यदि वर्टेक्स बफर ऑब्जेक्ट का उपयोग वर्टेक्स डेटा (जैसे उनकी स्थिति और बनावट निर्देशांक) को स्टोर करने के लिए किया जाता है और वीएओ में केवल स्टेटस फ्लैग होते हैं, तो उनका उपयोग कहां किया जा सकता है? उनका उद्देश्य क्या है?

जहाँ तक मैं (बहुत अधूरा और अस्पष्ट) जीएल विकी से समझा गया था, VAO का उपयोग एलिमेंट ऐरे बफर में वर्णित आदेश के बाद हर शिखर के लिए झंडे / प्रतिमा स्थापित करने के लिए किया जाता है, लेकिन विकी वास्तव में इसके लिए अस्पष्ट था और मैं ' वास्तव में वीएओ वास्तव में क्या करते हैं और मैं उन्हें कैसे नियोजित कर सकता हूं, इस बारे में निश्चित नहीं हूं।

जवाबों:


49

मुझे लगता है कि आप एक नमूने के साथ उनके उद्देश्य को बेहतर ढंग से समझेंगे। टिप्पणियों को पढ़कर आप समझेंगे कि कैसे VAO का उपयोग किया जाता है।

// BEGIN INITIALIZATION
// Define some vertex data 
struct Vertex {
  GLfloat position[3];
  GLfloat texcoord[2];
};
Vertex vertexdata[NUM_VERTS] = { ... };
GLubyte indexdata[NUM_INDICES] = { 0, 1, 2, ... };

// Create and bind a VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create and bind a BO for vertex data
GLuint vbuffer;
glGenBuffers(1, &vbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vbuffer);

// copy data into the buffer object
glBufferData(GL_ARRAY_BUFFER, NUM_VERTS * sizeof(Vertex), vertexdata, GL_STATIC_DRAW);

// set up vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texcoord));

// Create and bind a BO for index data
GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

// copy data into the buffer object
glBufferData(GL_ELEMENT_ARRAY_BUFFER, NUM_INDICES * sizeof(GLubyte), indexdata, GL_STATIC_DRAW);

// At this point the VAO is set up with two vertex attributes
// referencing the same buffer object, and another buffer object
// as source for index data. We can now unbind the VAO, go do
// something else, and bind it again later when we want to render
// with it.

glBindVertexArray(0);

// END INITIALIZATION

// BEGIN RENDER LOOP

// This is it. Binding the VAO again restores all buffer 
// bindings and attribute settings that were previously set up
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, NUM_INDICES, GL_UNSIGNED_BYTE, (void*)0);

// END RENDER LOOP

2
क्या मैं GL_DYNAMIC_DRAW बफर डेटा के साथ भी ऐसा कर सकता हूं? क्या रेंडरिंग भाग में glBindVertexArray (), glBufferData () और फिर glDrawElements () शामिल होंगे?
पिकु

आप इस उदाहरण में मानदंडों से कैसे निपटते हैं? मेरा मतलब है कि यदि आप GLfloat normal[3]अपने वर्टेक्स वर्ग में जोड़ते हैं और ग्राहक को मानदंडों को अपलोड करना चाहते हैं?
लिनेलो

1

VAO उपयोगी हैं, क्योंकि आपको हर समय सभी विशेषताओं को सेट करने की आवश्यकता नहीं है। यह भी तेजी से सिर्फ एक VAO बांधना चाहिए बल्कि सभी विशेषताओं को सेट करना चाहिए।


1

यह मेरा पसंदीदा लिंक है: http://www.songho.ca/opengl/gl_vertexarray.html

यह आपको VAO और VBO के बीच अंतर की बेहतर समझ प्राप्त करने में मदद करनी चाहिए। इसके अलावा, Id इस विषय पर OpenGL में एक अध्याय पढ़ने की सलाह देता है। लंबाई और उदाहरण के साथ इन बुनियादी बातों को समझाने में यह एक अच्छा काम करता है।


6
आपके द्वारा जोड़ा गया लेख VAO के कवर नहीं करता है, केवल वर्टेक्स एरेज़ (जो थोड़ी देर के आसपास रहा है)। मैं इन दोनों के बीच विशिष्ट अंतरों के बारे में बता रहा हूँ।
स्टीवन लू

ज्यादा अंतर नहीं है। VAO सिर्फ ऐरे डेटा को छोड़कर, वर्टेक्स एरे और उनके यूसेज और फॉर्मेट के बारे में सभी स्टेट्स को इनकैप्सुलेट करता है, जो VBO में स्टोर होता है। लेकिन आप सही हैं कि यह उत्तर (या लिंक) वास्तव में VAO के बारे में बात नहीं करता है।
क्रिस का कहना है कि मोनिका

0

व्याख्यान 9 यहाँ http://nccastaff.bournemouth.ac.uk/jmacey/CA1/index.html में इसके बारे में कुछ सामग्री है (जैसा कि मेरे बाकी नोट्स) और यदि आप उसी साइट पर NGL लाइब्रेरी को देखते हैं जो मेरे पास है एक वर्ग जो VAO के व्यवहार को लपेटता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.