2012-01-19 24 views
69

इम एक मुद्दा सामना करना पड़ रहा है जो मुझे VAO पर निर्भर है, लेकिन मैं निश्चित नहीं मानते ..ओपन VAO सर्वोत्तम प्रथाओं

मैं एक VAO, का सही उपयोग क्या मैं जीएल आरंभीकरण के दौरान करते थे के बारे में निश्चित नहीं हूँ एक सरल

glGenVertexArrays(1,&vao) 

एक

glBindVertexArray(vao) 

के बाद किया गया और बाद में, मेरी ड्राइंग पाइप लाइन में, मैं सिर्फ glBindBuffer(), glVertexAttribPointer(), glEnableVertexAttribArray (कहा जाता है) और इतने initally बाध्य VAO

यह एक सही व्यवहार है के बारे में देखभाल के बिना पर ..?

+27

मुझे यकीन नहीं है कि इस प्रश्न को -1 क्यों मिला .. यह कोई प्रयास नहीं दिखाता है और यह अस्पष्ट है? मैंने इसे पोस्ट करने से पहले चश्मा, विकी और मंचों से 3 दिन बिताए और मुझे कोई वास्तविक कारण नहीं मिला कि मुझे वीएओ का उपयोग करना चाहिए .. meh .. – user815129

+17

क्योंकि ठंडा ब्रो के लिए यह सब स्पष्ट है जैसे ही उनके कट-एंड-पेस्ट आसान, सामान समझने के साथ परेशान क्यों ?? उपरोक्त उत्तर, स्पष्ट और व्याख्यात्मक के रूप में – mlvljr

उत्तर

77

VAOs के संबंध में VBOs और बनावट की तरह ही काम करते हैं वे कैसे बंधे हैं। एक भी VAO अपने कार्यक्रम कोई प्रदर्शन लाभ निकलेगा क्योंकि आप के रूप में अच्छी बस सब पर VAOs बिना प्रतिपादन हो सकता है की पूरी लंबाई के लिए बाध्य करने के बाद। वास्तव में यह धीमी कैसे कार्यान्वयन अवरोध शिखर सेटिंग्स विशेषता के रूप में वे तैयार किया जा रहा हो पर निर्भर करता है हो सकता है।

वीएओ का बिंदु प्रारंभिक दौरान एक ऑब्जेक्ट खींचने के लिए आवश्यक सभी विधियों को चलाने और मुख्य लूप के दौरान सभी अतिरिक्त विधि कॉल ओवरहेड को काटना है। बिंदु कई वीएओ होना है और ड्राइंग करते समय उनके बीच स्विच करना है।

initialization: 
    for each batch 
     generate, store, and bind a VAO 
     bind all the buffers needed for a draw call 
     unbind the VAO 

main loop/whenever you render: 
    for each batch 
     bind VAO 
     glDrawArrays(...); or glDrawElements(...); etc. 
    unbind VAO 

यह प्रत्येक शिखर विशेषता के लिए बाध्यकारी/unbinding बफ़र्स और गुजर सभी सेटिंग्स की गंदगी से बचा जाता है और साथ बस एक ही यह बदल देता है:

सबसे अच्छा अभ्यास के संदर्भ में, यहाँ कैसे आप अपने कोड का आयोजन करना चाहिए विधि कॉल, एक वीएओ बाध्यकारी।

+0

आह हाँ, वास्तव में मैंने पहले भी वीएओ का उपयोग नहीं किया था .. जब तक कि जीएल चश्मा किसी त्रुटि को शिकायत करना शुरू नहीं कर लेता है (और होगा) अगर कोई वीएओ बंधे न हो .. धन्यवाद – user815129

+1

क्या वीएओ को अनइंड करना वास्तव में आवश्यक है? मुझे – user815129

+3

के आस-पास विभिन्न प्रथाएं मिलीं, यह जरूरी नहीं है, लेकिन आमतौर पर मैं कुछ अन्य ऑब्जेक्ट्स को वीएओ (डीबग ड्राइंग/फ़ॉन्ट रेंडरिंग लाइब्रेरी/इत्यादि) के बिना प्रस्तुत करने का निर्णय लेता हूं, जैसा कि (जहां तक ​​मुझे पता है) विशेषता को प्रतिस्थापित करता है वर्तमान में बाध्य वीएओ के लिए सेटिंग्स। –

24

नहीं, ऐसा नहीं है कि आप वीएओ का उपयोग कैसे करते हैं। आप उसी तरह तुम कैसे VBO या बनावट, या shaders का उपयोग कर रहे हैं में VAO उपयोग करना चाहिए। पहले इसे स्थापित करें। और प्रतिपादन के दौरान केवल उन्हें संशोधित किए बिना बाध्य करें।

VAO साथ

तो आप निम्नलिखित है:

void Setup() { 
    glGenVertexArrays(..); 
    glBindVertexArray(..); 
    // now setup all your VertexAttribPointers that will be bound to this VAO 
    glBindBuffer(..); 
    glVertexAttribPointer(..); 
    glEnableVertexAttribArray(..); 
} 

void Render() { 
    glBindVertexArray(vao); 
    // that's it, now call one of glDraw... functions 
    // no need to set up vertex attrib pointers and buffers! 
    glDrawXYZ(..) 
} 

भी देखें इन कड़ियों:

+0

। धन्यवाद – user815129

+0

यह उत्तर उच्च होना चाहिए। यह विशेष रूप से मेरा बग ट्रैक करने के लिए एक कठिन तय किया। – abarax

+1

'glEnableVertexAttribArray (...)' glVertexAttribPointer (...) 'से पहले कहा जाना चाहिए। कुछ ड्राइवर (मेरा सहित) _really_ इसे दूसरे तरीके से पसंद नहीं करता है। – RecursiveExceptionException

10

क्या यह एक सही अभ्यास है?

हाँ, यह पूरी तरह से कानूनी और वैध है। अच्छी है? खैर ...

वहाँ बात की इस तरह के बारे में कुछ informal performance testing किया गया है। और ऐसा लगता है, कम से कम एनवीआईडीआईए हार्डवेयर पर जहां इसका परीक्षण किया गया था, वीएओ के "उचित" उपयोग (यानी: हर किसी ने वकालत की) वास्तव में धीमी कई मामलों में है। यह विशेष रूप से सच है यदि वीएओ बदलना बदलता नहीं है तो कौन से बफर बंधे हैं।

मेरे ज्ञान के लिए एएमडी हार्डवेयर पर कोई समान प्रदर्शन परीक्षण नहीं हुआ है।आम तौर पर, जब तक उनके साथ कुछ बदलाव नहीं होता है, यह वीएओ का स्वीकार्य उपयोग है।

+0

निश्चित रूप से प्रत्येक वीएओ में पर्याप्त विभिन्न राज्य होते हैं जो ट्रैक करते हैं, जो रेंडर लूप के दौरान मैन्युअल रूप से बफर और अट्रिब ptrs को स्विच करने के लिए कई कॉल की आवश्यकता होती है, हम वीएओ के उपयोग से बेहतर प्रदर्शन देखना शुरू कर देंगे? –

+0

दुर्भाग्य से, लिंक मर चुका है। –

3

जब मैंने कोशिश की तो रॉबर्ट का उत्तर मेरे लिए काम करता था। क्या इसे यहाँ लायक है कोड, गो में, कई वर्टेक्स गुण वस्तुओं का उपयोग करने का है:

// VAO 1

vao1 := gl.GenVertexArray() 
vao1.Bind() 

vbo1 := gl.GenBuffer() 
vbo1.Bind(gl.ARRAY_BUFFER) 

verticies1 := []float32{0, 0, 0, 0, 1, 0, 1, 1, 0} 
gl.BufferData(gl.ARRAY_BUFFER, len(verticies1)*4, verticies1, gl.STATIC_DRAW) 

pa1 := program.GetAttribLocation("position") 
pa1.AttribPointer(3, gl.FLOAT, false, 0, nil) 
pa1.EnableArray() 
defer pa1.DisableArray() 

vao1.Unbind() 

// VAO 2 

vao2 := gl.GenVertexArray() 
vao2.Bind() 

vbo2 := gl.GenBuffer() 
vbo2.Bind(gl.ARRAY_BUFFER) 

verticies2 := []float32{-1, -1, 0, -1, 0, 0, 0, 0, 0} 
gl.BufferData(gl.ARRAY_BUFFER, len(verticies2)*4, verticies2, gl.STATIC_DRAW) 

pa2 := program.GetAttribLocation("position") 
pa2.AttribPointer(3, gl.FLOAT, false, 0, nil) 
pa2.EnableArray() 
defer pa2.DisableArray() 

vao2.Unbind() 

फिर अपने मुख्य पाश में आप उन्हें इस तरह के रूप में उपयोग कर सकते हैं:

for !window.ShouldClose() { 
    gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) 

    vao1.Bind() 
    gl.DrawArrays(gl.TRIANGLES, 0, 3) 
    vao1.Unbind() 

    vao2.Bind() 
    gl.DrawArrays(gl.TRIANGLES, 0, 3) 
    vao2.Unbind() 

    window.SwapBuffers() 
    glfw.PollEvents() 

    if window.GetKey(glfw.KeyEscape) == glfw.Press { 
     window.SetShouldClose(true) 
    } 
} 

https://gist.github.com/mdmarek/0f73890ae2547cdba3a7

:

आप पूर्ण स्रोत को देखने के लिए चाहते हैं, यह एक सार के रूप में उपलब्ध है और गो-जीएल में उदाहरण से प्राप्त होता है

मूल उत्तर के लिए सभी को धन्यवाद, मेरे पास ECrownofFire के समान प्रश्न था।

+3

आपको vao2 बाध्य करने से पहले vao1 को अनइंड करने की आवश्यकता नहीं है, बस बाध्यकारी vao2 पर्याप्त होगा। – havokentity

संबंधित मुद्दे