2011-08-28 9 views
7

में विभिन्न वर्टेक्स विशेषताओं को संग्रहीत करना क्या विभिन्न वर्टेक्स बफर में विभिन्न वर्टेक्स विशेषताओं को स्टोर करना संभव है?विभिन्न VTE के

सभी उदाहरण मैंने देखा है अब तक इस

float data[] = 
{ 
//position 
    v1x, v1y, v1z, 
    v2x, v2y, v2z, 
    ... 
    vnx, vny, vnz, 

//color 
    c1r, c1g, c1b, 
    c2r, c2g, c2b, 
    ... 
    cnr, cng, cnb, 
}; 
GLuint buffname; 
glGenBuffers(1, &buffname); 
glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 

और ड्राइंग की तरह कुछ कुछ इस तरह से किया जाता है कार्य करें:

glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, (void*)(3*n)); 

glDrawArrays(GL_TRIANGLES, 0, n/3); 

glDisableVertexAttrib(position_location); 
glDisableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

है नहीं यह संभव स्थिति डाटा स्टोर करने और विभिन्न वीबीओ में रंग डेटा? समस्या यह है कि मुझे समझ में नहीं आता कि यह कैसे काम करेगा क्योंकि आप एक बार में दो बफर बांध नहीं सकते हैं, क्या आप?

यदि कोई सरल लेकिन अक्षम समाधान है, तो मैं इसे अधिक जटिल लेकिन कुशल समाधान पर पसंद करूंगा क्योंकि मैं प्राथमिक शिक्षा स्थिति में हूं और मैं चीजों को बहुत जटिल नहीं करना चाहता हूं।

इसके अलावा, यदि मैं जो पूछ रहा हूं वह संभव है, तो क्या यह एक अच्छा विचार है या नहीं?

स्पष्ट करने के लिए: मैं समझता हूँ कि मैं कैसे अलग VBO के दशक में अलग-अलग विशेषताओं की दुकान सकता है। मुझे समझ में नहीं आता कि मैं उन्हें बाद में कैसे आकर्षित करूंगा।

उत्तर

9

विशेषता स्थान एक्स और बफर उद्देश्य यह है कि उस विशेषता प्रदान करता है के बीच सहयोग glVertexAttribPointer कमांड के साथ किया जाता है। जिस तरह से यह काम करता है वह सरल है, लेकिन अनजान है।

समय glVertexAttribPointer पर कहा जाता है, जो कुछ भी बफर वस्तु वर्तमान में GL_ARRAY_BUFFER के लिए बाध्य है विशेषता एक्स, जहां X glVertexAttribPointer के पहले पैरामीटर है के साथ संबद्ध हो जाती है (वह हिस्सा बहुत से लोगों को नहीं मिलता है है)।

तो अगर आप एक विशेषता है जो एक बफर और एक विशेषता है कि एक और से आता है से आता है करना चाहते हैं, आप ऐसा करते हैं:

glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, buffPosition); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, buffColor); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 

कि क्या आप अलग बफ़र्स में विशेषताओं विभाजित करना चाहिए का सवाल है। .. मैं कहूंगा कि आपको केवल तभी करना चाहिए यदि आपके पास एक प्रदर्शनशील की आवश्यकता है।

उदाहरण के लिए, मान लीजिए कि आप शायद पानी प्रभाव के कुछ प्रकार के लिए एक गतिशील ऊंचाई-मैप कर रहे हैं, करते हैं। प्रत्येक तत्व की जेड स्थिति बदलती है, लेकिन इसका मतलब यह भी है कि मानक बदल जाते हैं। हालांकि, एक्सवाई पदों और बनावट निर्देशांक बदल नहीं है।

कुशल स्ट्रीमिंग के लिए अक्सर डबल-बफरिंग बफर ऑब्जेक्ट्स या उन्हें अमान्य करने की आवश्यकता होती है (उन्हें एक glBufferData (NULL) या glMapBufferRange (GL_INVALIDATE_BIT) के साथ पुन: आवंटित करना)। किसी भी तरह से केवल तभी काम करता है जब स्ट्रीम किए गए डेटा गैर-स्ट्रीम किए गए डेटा से किसी अन्य बफर ऑब्जेक्ट में हों।

एक स्पष्ट की जरूरत का एक और उदाहरण है, तो स्मृति चिंता का विषय है और कई वस्तुओं कुछ विशेषता सूचियों का हिस्सा है। शायद वस्तुओं में अलग-अलग स्थिति और सामान्य सरणी होती है लेकिन समान रंग और बनावट समन्वय सरणी होती है। या कुछ इस तरह का।

लेकिन अन्यथा, किसी ऑब्जेक्ट के लिए सब कुछ एक बफर में रखना सबसे अच्छा है। यहां तक ​​कि यदि आप सरणी को अंतःस्थापित नहीं करते हैं।

+1

बहुत बहुत धन्यवाद! मै समझता हुँ!बहुत सी चीज अचानक स्पष्ट हो गई :))) मेरे दूसरे प्रश्न के बारे में क्या? क्या इसे आम तौर पर एक अच्छा विचार माना जाता है या नहीं? –

+1

@ आर्मेन: मेरा संपादन देखें। –

+0

अब मैं इसे और अधिक स्पष्ट देखता हूं। बहुत बहुत धन्यवाद। तो यह सरल मामलों में हमें निकोल द्वारा वर्णित पहले दृष्टिकोण का उपयोग करना चाहिए, और यदि आवश्यक है तो हम विभिन्न वीबीओ का उपयोग करें। बहुत अधिक स्पष्ट धन्यवाद! –

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