2012-07-01 14 views
7

मैं पाइथन में एक मॉड्यूल लिखने की कोशिश कर रहा हूं जो स्क्रीन पर रंग डेटा (आरजीबी) की एक संख्यात्मक सरणी खींचेगा। फिलहाल मैं इस समय इस तरह एक 3 आयामी रंग सरणी का उपयोग कर रहा:पायपीनग्ल बफर गतिशील पढ़ने से numpy array

numpy.ones((10,10,3),dtype=np.float32,order='F') # (for 10x10 pure white tiles) 

एक बफर करने के लिए यह बाध्यकारी है और एक 10x10 टाइल्स (बिंदु स्प्राइट) की एक सरणी के लिए डेटा प्रसारण करने के लिए एक glVertexAttribArray का उपयोग कर (इस मामले में सरणी) और यह एक स्थिर छवि के लिए ठीक काम करता है।

लेकिन मैं सरणी में डेटा को बदलने में सक्षम होना चाहता हूं और बफर इसे स्क्रैच से पुनर्निर्माण किए बिना इस परिवर्तन को प्रतिबिंबित करना चाहता हूं।

glBufferData(GL_ARRAY_BUFFER, buffer_data.nbytes, buffer_data, GL_DYNAMIC_DRAW) 

जहां buffer_data numpy सरणी है:

वर्तमान में मैं के साथ बफर का निर्माण किया है। क्या (अगर कुछ भी) मैं इसके बजाय पास कर सकता हूं (शायद कुछ स्मृति में स्मृति?)

+0

शायद buffer_data.ctypes.data? मैं भी उत्सुक हूँ; अगर आप इसे समझते हैं तो हमें बताएं। – Luke

+0

मैंने ग्लैप/अनमैपबफर का उपयोग करने के लिए अभी कोशिश कर थोड़ा सा प्रगति की है। मैं ctypes और numpy.frombuffer का उपयोग करके एक सरणी में बफर सामग्री को सफलतापूर्वक पढ़ सकता हूं, लेकिन GlMapBuffer में GL_READ_WRITE ध्वज के साथ भी मैं इस सरणी को नहीं लिख सकता (लिखने योग्य ध्वज को सही पर भी सेट नहीं कर सकता!)। तो सुनिश्चित नहीं है कि वहां क्या हो रहा है ... (मैं vbo मॉड्यूल से मैपिंग कोड का उपयोग कर रहा हूं) – user1483596

उत्तर

2

यदि आप तेजी से बदलते numpy सरणी को तुरंत प्रस्तुत करना चाहते हैं, तो आप glumpy पर एक नज़र डालने पर विचार कर सकते हैं। यदि आप एक शुद्ध पायपोन्ग समाधान के साथ जाते हैं तो मैं यह देखने के लिए भी उत्सुक हूं कि यह कैसे काम करता है।

संपादित करें: कैसे Glumpy का उपयोग करने का एक उदाहरण के लिए see my answer here एक लगातार अद्यतन करने numpy सरणी

0

glBufferData पूरे बफर को अद्यतन करने के रूप में यह एक नया बफर हर बार पैदा करेगा के लिए है देखने के लिए।

glMapBuffer/glUnmapBuffer:

क्या आप चाहते हैं या तो है।

glMapBuffer क्लाइंट मेमोरी में बफर की प्रतिलिपि बनाता है और स्थानीय रूप से मानों को बदलता है, फिर glunmapBuffer के साथ GPU में परिवर्तनों को दबाएं।

glBufferSubData

यह आपको एक बफर के छोटे वर्गों अद्यतन करने के लिए, पूरे बात करने के बजाय अनुमति देता है।

ऐसा लगता है कि आप कुछ कक्षा भी चाहते हैं जो स्वचालित रूप से इन परिवर्तनों को उठाता है। मैं यह पुष्टि नहीं कर सकता कि यह एक अच्छा विचार है, लेकिन आप numpy.array को लपेट या विस्तारित कर सकते हैं और अंतर्निहित विधि setitem पर सवारी कर सकते हैं।