opengl
VAO का उपयोग करना
खोज…
परिचय
वर्टेक्स ऐरे ऑब्जेक्ट स्टोर करता है कि कैसे opengl को वीबीओ के सेट की व्याख्या करनी चाहिए।
संक्षेप में, यह आपको हर बार एक नए जाल को प्रस्तुत करने के लिए glVertexAttribPointer को कॉल करने से बचने देगा।
यदि आप वीएओ के साथ सौदा नहीं करना चाहते हैं, तो आप बस एक बना सकते हैं और इसे प्रोग्राम आरंभीकरण के दौरान बांध सकते हैं और दिखावा कर सकते हैं कि वे मौजूद नहीं हैं।
वाक्य - विन्यास
शून्य glEnableVertexAttribArray (GLuint attribIndex);
शून्य glDisableVertexAttribArray (GLuint attribIndex);
void glVertexAttribPointer (GLuint attribIndex, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * पॉइंटर);
शून्य glVertexAttribFormat (GLuint attribIndex, GLint आकार, GLenum प्रकार, GLboolean सामान्यीकृत, ग्लुएंट सापेक्षताप);
शून्य glVertexAttribBinding (GLuint attribIndex, GLuint बाइंडिंगex);
void glBindVertexBuffer (GLuint बाइंडिंगइंडेक्स, GLuint बफर, GLintptr ऑफसेट, GLintptr स्ट्राइड);
पैरामीटर
पैरामीटर | विवरण |
---|---|
attribIndex | शीर्ष विशेषता के लिए स्थान, जिसके लिए शीर्ष सरणी डेटा खिलाएगी |
आकार | विशेषता से निकाले जाने वाले घटकों की संख्या |
प्रकार | बफर में विशेषता डेटा का C ++ प्रकार |
सामान्यीकृत | चाहे पूर्णांक प्रकारों को फ्लोटिंग-पॉइंट रेंज में मैप करना है [0, 1] (अहस्ताक्षरित के लिए) या [-1, 1] (हस्ताक्षरित के लिए) |
सूचक | बाइट में बफर को विशेषता के डेटा के पहले बाइट (विरासत कारणों के लिए void* करने के लिए) को ऑफसेट करता है |
ओफ़्सेट | आधार बाइट बफर की शुरुआत से ऑफसेट होता है जहां सरणी डेटा शुरू होता है |
relativeOffset | बफर के लिए आधार ऑफसेट के सापेक्ष एक विशेष विशेषता की ऑफसेट |
छलांग | एक वर्टेक्स के डेटा से अगले तक बाइट्स की संख्या |
बफर | बफ़र ऑब्जेक्ट जहाँ शीर्ष सरणियाँ संग्रहीत हैं |
bindingIndex | वह स्रोत जिसके लिए स्रोत बफर ऑब्जेक्ट बाध्य होगा |
टिप्पणियों
अलग विशेषता प्रारूप VAO सेटअप के साथ interoperate कर सकते हैं glVertexAttribPointer
(उत्तरार्द्ध पूर्व के संदर्भ में परिभाषित किया जाता है)। लेकिन ऐसा करते समय आपको सावधान रहना चाहिए।
अलग विशेषता प्रारूप संस्करण में 4.5 में प्रत्यक्ष राज्य पहुंच (डीएसए) समकक्ष है। ये एक ही पैरामीटर होंगे लेकिन बाध्य VAO का उपयोग करने के बजाय, VAO को संशोधित किया जा रहा है। डीएसए डी इंडेक्स बफर का उपयोग करते समय glDrawElements
glVertexArrayElementBuffer(vao, ebo);
साथ सेट किया जा सकता है glVertexArrayElementBuffer(vao, ebo);
संस्करण 3.0
प्रत्येक विशेषता एक घटक गणना, प्रकार, सामान्यीकृत, ऑफसेट, स्ट्राइड और वीबीओ से जुड़ी है। VBO को एक पैरामीटर के रूप में स्पष्ट रूप से पारित नहीं किया गया है, लेकिन इसके बजाय कॉल के समय GL_ARRAY_BUFFER के लिए बाध्य बफर है।
void prepareMeshForRender(Mesh mesh){
glBindVertexArray(mesh.vao);
glBindBuffer(GL_ARRAY_BUFFER, mesh.vbo);
glVertexAttribPointer (posAttrLoc, 3, GL_FLOAT, false, sizeof(Vertex), mesh.vboOffset + offsetof(Vertex, pos));//will associate mesh.vbo with the posAttrLoc
glEnableVertexAttribArray(posAttrLoc);
glVertexAttribPointer (normalAttrLoc, 3, GL_FLOAT, false, sizeof(Vertex), mesh.vboOffset + offsetof(Vertex, normal));
glEnableVertexAttribArray(normalAttrLoc);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.ebo); //this binding is also saved.
glBindVertexArray(0);
}
void drawMesh(Mesh[] meshes){
foreach(mesh in meshes){
glBindVertexArray(mesh.vao);
glDrawElements(GL_TRIANGLES, mesh.vertexCount, GL_UNSIGNED_INT, mesh.indexOffset);
}
}
संस्करण 4.3
OpenGL 4.3 (या ARB_separate_attrib_format) वर्टेक्स डेटा को निर्दिष्ट करने का एक वैकल्पिक तरीका जोड़ता है, जो एक विशेषता के लिए बाध्य डेटा के प्रारूप और डेटा प्रदान करने वाले बफर ऑब्जेक्ट स्रोत के बीच एक अलगाव बनाता है। इसलिए प्रति मेष VAO होने के बजाय, आपके पास प्रति स्वरूप VAO हो सकता है।
प्रत्येक गुण एक शीर्ष प्रारूप और एक बाध्यकारी बिंदु के साथ जुड़ा हुआ है। वर्टेक्स प्रारूप में प्रकार, घटक गणना शामिल है, चाहे वह सामान्यीकृत हो, और डेटा की शुरुआत से उस उच्च आवृत्ति तक सापेक्ष ऑफसेट। बाध्यकारी बिंदु निर्दिष्ट करता है कि कौन सा बफर एक विशेषता से अपना डेटा लेता है। दोनों को अलग करके, आप किसी भी शीर्ष प्रारूप का सम्मान किए बिना बफ़र्स को बांध सकते हैं। आप उस बफर को भी बदल सकते हैं जो एकल बाइंड कॉल के साथ कई विशेषताओं को डेटा प्रदान करता है।
//accessible constant declarations
constexpr int vertexBindingPoint = 0;
constexpr int texBindingPoint = 1;// free to choose, must be less than the GL_MAX_VERTEX_ATTRIB_BINDINGS limit
//during initialization
glBindVertexArray(vao);
glVertexAttribFormat(posAttrLoc, 3, GL_FLOAT, false, offsetof(Vertex, pos));
// set the details of a single attribute
glVertexAttribBinding(posAttrLoc, vertexBindingPoint);
// which buffer binding point it is attached to
glEnableVertexAttribArray(posAttrLoc);
glVertexAttribFormat(normalAttrLoc, 3, GL_FLOAT, false, offsetof(Vertex, normal));
glVertexAttribBinding(normalAttrLoc, vertexBindingPoint);
glEnableVertexAttribArray(normalAttrLoc);
glVertexAttribFormat(texAttrLoc, 2, GL_FLOAT, false, offsetof(Texture, tex));
glVertexAttribBinding(texAttrLoc, texBindingPoint);
glEnableVertexAttribArray(texAttrLoc);
फिर ड्रा के दौरान आप वाओ को बांध कर रखें और केवल बफर बाइंडिंग बदलें।
void drawMesh(Mesh[] mesh){
glBindVertexArray(vao);
foreach(mesh in meshes){
glBindVertexBuffer(vertexBindingPoint, mesh.vbo, mesh.vboOffset, sizeof(Vertex));
glBindVertexBuffer(texBindingPoint, mesh.texVbo, mesh.texVboOffset, sizeof(Texture));
// bind the buffers to the binding point
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.ebo);
glDrawElements(GL_TRIANGLES, mesh.vertexCount, GL_UNSIGNED_INT, mesh.indexOffset);
//draw
}
}