2012-08-14 28 views
5

के साथ वीबीओ डेटा अपडेट करना मैं वर्तमान में जावा 1.6 में लिखित एक 2 डी टॉप-डाउन आरपीजी पर काम कर रहा हूं जो एलडब्ल्यूजेजीएल के साथ है। मैंने अपने गेम में वीबीओ के उपयोग को लागू किया और अब मैं उनमें से दो को बनाए रखता हूं: एक वर्टेक्स डेटा और एक बनावट कोर के लिए।glBufferSubData()

यह सब ठीक काम कर रहा है सिवाय इसके कि मेरे पास ऑब्जेक्ट्स को अपडेट करने के लिए वास्तव में तार्किक तरीका नहीं है। उदाहरण के तौर पर, यदि मैं अपनी बनावट को बदलने के लिए एक निश्चित टाइल चाहता हूं (बनावट शीट के दूसरे क्षेत्र को दिखाने के लिए वीबीओ के अंदर बनावट निर्देशांक बदलें), तो मैं केवल बनावट निर्देशांक को बदलने के लिए एक तरीका नहीं देख सकता यह एकल टाइल। अब मैं सोच सकता हूं कि बफर को हर लूप की आवश्यकता वाले सभी डेटा के साथ भरना और उन्हें प्रत्येक फ्रेम में glBufferData के साथ अपलोड करना हो सकता है। यह काम करता है लेकिन ऐसा करने का सबसे अच्छा तरीका प्रतीत नहीं होता है (या यह करता है?)।

अब, glBufferSubData कमांड है जो नई मेमोरी आवंटित नहीं करेगा बल्कि केवल उस हिस्से को बदल देगा जिसे मैं बदलने के लिए कहता हूं। बात यह है कि मुझे नहीं पता कि उस क्षेत्र का ट्रैक कैसे रखा जाए जिसे बदला जाना है (ऑफ़सेट)। एलडब्ल्यूजेजीएल एक ग्लैफरफबडाटा (लक्ष्य, ऑफ़सेट, डेटा) प्रदान करता है; आदेश, जो केवल काम करने के लिए बफर की भिखारी की जरूरत है। क्या ऑफसेट कुछ इंडेक्स की तरह है?

तो मैं पहले VBO करने के लिए इन बफ़र्स को अपलोड करने और फिर दूसरी नाव [] के दूसरे मूल्य बदलना चाहते हैं:,

FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize); 
vertexData.put(new float[]{100, 100, 300, 100, 300, 300, 100, 300}); 
vertexData.put(new float[]{400, 100, 600, 100, 600, 300, 400, 300}); 
vertexData.flip(); 

मैं नया डेटा उत्पन्न होगा एक छोटा सा FloatBuffer अंदर डाल दिया और इसे glbufferSubData (GL_VERTEX_ARRAY, 10, newFloatBuffer) के साथ अपलोड करें ;? 10 इसलिए है क्योंकि मैं दसवें पुराने मूल्य से मूल्यों को बदलना चाहता हूं।

क्या यह सही है? इसे करने का कोई बेहतर तरीका है? और फिर: क्या यह ठीक है अगर मैं हर फ्रेम को पूरा डेटा दोबारा अपलोड करता हूं?

+0

ऐसा करने के आसान तरीके हैं। या तो आप एक और बनावट के साथ एक ही ज्यामिति खींचते हैं। या आप वर्टेक्स शेडर में बनावट समन्वय संशोधन करते हैं। –

उत्तर

6

LWJGL'sglBufferSubData() ऑफ़सेट को बाइट गिनती के रूप में उम्मीद करता है, क्योंकि किसी को मनमाने ढंग से बफर स्थानों पर मनमाने ढंग से डेटा लिखने में सक्षम होना चाहिए। यदि आप इंडेक्स i पर फ्लोट को अपडेट करना चाहते हैं, तो ऑफसेट i * 4 होगा, क्योंकि जावा फ्लोट्स लेते हैं, बहुत आम, 4 बाइट्स। सभी बचे हुए बफर सामग्री लिखी जाएंगी, इसलिए, लक्ष्य बफर को कम से कम
(i + floatBuffer.remaining()) * 4 बाइट्स की क्षमता रखने की आवश्यकता है। सही तैयारी के लिए, बफर flip() विधि देखें या लिखित होने वाली शेष सामग्री निर्दिष्ट करने के लिए limit(int) के साथ position(int) का उपयोग करें।

यह अद्यतन रणनीति तब तक ठीक है जब तक आप glbufferSubData() को अस्थायी FloatBuffers के साथ कई बार नहीं कहते हैं। आपके पास स्वैपिंग (पिंग पोंग) के बराबर आकार के साथ दूसरा लक्ष्य बफर भी हो सकता है, जो कि एक समग्र अद्यतन के लिए MapBuffer() का उपयोग करके मानचित्र कर सकता है, जबकि दूसरा उपयोग में है।

मैं क्लाइंट साइड पर एक पूर्ण फ़्लोटबफर रखना चाहता हूं और को कई बार कॉल करने के बजाय इसे glBufferData() का उपयोग करके अपलोड करूँगा। लेकिन कुछ संख्याओं को जानने के बिना, यह कहना मुश्किल है।

+0

बहुत बहुत धन्यवाद। मैं क्लाइंट फ्लोटबफर रणनीति को कार्यान्वित करूंगा और इसे अभी रखूंगा। बाद में मैं कशेरुक शेडर्स की कोशिश करूंगा। – Thiago

+0

आपका स्वागत है! शेडर्स एक दिलचस्प क्षेत्र हैं। यदि आपको समान रूप से आकार के बनावट क्षेत्रों को बदलना है, तो सरणी बनावट बनावट मानचित्र/शीट के विकल्प के विकल्प हैं। आसानी से बदलाव को मिश्रित करने के लिए 3 डी बनावट का उपयोग किया जा सकता है। – Sam

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

  • कोई संबंधित समस्या नहीं^_^