2009-01-19 15 views
7

मैं ओपनगल के साथ बहुत नौसिखिया हूँ। मुझे लगता है कि glReadPixels भयानक है तो ऐसा करने का सबसे अच्छा तरीका क्या है? मैं एक ऐसा कार्य करने के बारे में सोच रहा था जो एक बनावट आयता को लॉक करता है, तो पिक्सेल को रैम में कॉपी करने के लिए glTexSubImage2D की तरह कुछ करें, इसे संशोधित करें, फिर राम को वापस बनावट में कॉपी करने के लिए glTexSubImage2D का उपयोग करें। क्या यह एक अच्छा तरीका है? मैं एक ध्वज की तरह ऑप्टिमाइज़ेशन के बारे में सोच सकता हूं कि बनावट की प्रतिलिपि न लें क्योंकि आप इसे सब ओवरराइट कर देंगे और कैशिंग करेंगे।ओपनजीएल में पिक्सेल तक पहुंचने का सबसे अच्छा तरीका?

मैं अन्य विधियों का उपयोग कैसे कर सकता हूं? क्या आप में से कोई मुझे उन ग्लैक्स फ़ंक्शंस के नाम बता सकता है जिन्हें मैं चाहता हूं (इसलिए मैं मैन्युअल पढ़ सकता हूं) या मुझे ट्यूटोरियल पर इंगित कर सकता हूं? मैंने googling की कोशिश की लेकिन ज्यादातर परिणाम ऐसा लगता है कि यह मेरे मन में क्या नहीं कर रहा था।

+1

क्या आप कृपया जो कुछ करने की कोशिश कर रहे हैं उस पर विस्तार से बता सकते हैं? निल्स सही है, यदि आपको वास्तव में आवश्यकता है, तो glReadPixels का उपयोग करें, लेकिन यह तेज़ होने की अपेक्षा न करें। यदि आप समझाते हैं कि आप क्या करने की कोशिश कर रहे हैं, तो शायद यहां कोई व्यक्ति बेहतर तरीके सुझा सकता है और पूरी तरह से पिक्सेल पढ़ने की आवश्यकता से बच सकता है। –

+0

ओजे के अनुरोध के लिए दूसरा। बहुत कम (प्रतिपादन) चीजें हैं जिन्हें वास्तविक पिक्सल पुनर्प्राप्त करने की आवश्यकता होती है। –

उत्तर

6

glReadPixels जाने का रास्ता है।

हां, यह धीमा - भयानक धीमा है। लेकिन यह वही तरीका है। डायरेक्टएक्स समकक्ष (जैसे पिक्सेल लॉक करना और पढ़ना) या तो बहुत तेज़ नहीं है।

सामान्य तौर पर आप पिक्सल वापस पढ़ने और डेटा पर सीपीयू के साथ कुछ कर रही बचना चाहते हैं। आप पिक्सेल-शेडर्स का उपयोग करके काफी प्रोसेस कर सकते हैं, लेकिन यदि आप स्क्रीनशॉट करना चाहते हैं (जहां सीपीयू में डेटा समाप्त होना चाहिए) तो इससे आपकी मदद नहीं होगी।

0

सबसे अच्छा विचार के रूप में लिखने-ही वीडियो कार्ड पर फ्रेम बफर स्मृति के इलाज के लिए किया जाएगा। मुझे लगता है कि कारण यह है कि पढ़ने के खर्च पर, सीपीयू पक्ष से लिखने के लिए वीडियो मेमोरी अनुकूलित है। (स्पष्ट रूप से वीडियो मेमोरी से वीडियो मेमोरी को तुरंत पढ़ा जा सकता है - इसे वास्तविक समय में मॉनीटर पर भेजना है)

सबसे तेज़ समाधान उस पर निर्भर करेगा जो आप करने की कोशिश कर रहे हैं (विस्तृत करने की देखभाल ?)।

आप मुख्य स्मृति में अपने स्वयं के फ्रेमबफर रखने, तो एक बनावट के लिए प्रत्येक फ्रेम कि कॉपी करने और ओपन में यह प्रतिपादन रोक कुछ भी नहीं है। मैंने पहले यह किया है और यह glReadPixels की तुलना में बहुत तेज़ है, हालांकि आप अन्य ओपनजीएल प्रतिपादन गतिविधि के परिणामों को वापस पढ़ने की क्षमता खो देते हैं। इसका प्रयोग करें यदि आपको बस इतना करना है कि आपके दृश्य के हिस्से के फ्रेम-दर-फ्रेम स्थिति को रखें। उदाहरण: एक गतिशील बनावट उत्पन्न करना जो पिक्सेल शेडर के माध्यम से नहीं किया जा सकता है।

तुम भी वापस डेटा के एक बहुत छोटे सेट पढ़ने के साथ भाग प्राप्त करने में सक्षम हो सकता है। मैंने ऐसा किया जब मैं गैर यथार्थवादी प्रतिपादन के साथ खेल रहा था। मैंने अपना दृश्य लिया, इसे 160x120 पर प्रस्तुत किया, इसे वापस मुख्य स्मृति में पढ़ा, फिर इसे 2 डी स्प्राइट्स के संग्रह के रूप में पुनः प्रस्तुत किया।

6

पहले कहा के रूप में glReadPixels जाने का रास्ता है। फ्रेमबफर पढ़ने या पिक्सेल तक पहुंचने का एक तरीका है ARB_pixel_buffer_object एक्सटेंशन का उपयोग करना। यह आपको glReadPixels को असीमित रूप से करने देगा और जब आपको बड़ी मात्रा में पिक्सेल पढ़ने की आवश्यकता होती है तो प्रदर्शन बहुत तेज हो सकता है। प्रदर्शन बहुत तेज़ हो सकता है क्योंकि यदि आप "दाएं" प्रारूप का उपयोग करते हैं तो स्थानांतरण डीएमए का उपयोग करके किया जाता है और बहुमूल्य CPU चक्रों का उपभोग नहीं करता है।

+1

'ARB_pixel_buffer_object एक्सटेंशन' का उपयोग करने के तरीके के बारे में कोई उदाहरण? – Niklas

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