2010-11-06 16 views
6

में बड़ी संख्या में पिक्सेल ड्रॉइंग मैं कुछ ध्वनि प्रसंस्करण कोड पर काम कर रहा हूं और अब मैं कुछ विज़ुअलाइज़ेशन कर रहा हूं। मैंने spectrogram स्पेक्ट्रोग्राम बनाना समाप्त कर दिया, लेकिन मैं इसे कैसे आकर्षित कर रहा हूं यह बहुत धीमा है।ओपनजीएल

मैं 2 डी ड्राइंग करने के लिए ओपनजीएल का उपयोग कर रहा हूं, जिसने मदद के लिए और अधिक कठिन खोज की है। इसके अलावा मैं ओपनजीएल के लिए बहुत नया हूं, इसलिए मुझे नहीं पता कि मानक तरीके से क्या किया जाता है।

मैं एक बड़े मैट्रिक्स में प्रत्येक पिक्सेल के लिए आर, जी, बी मान संग्रहीत कर रहा हूं। प्रत्येक बार जब मुझे एक छोटा सा ध्वनि खंड मिलता है, तो मैं इसे संसाधित करता हूं और इसे पिक्सल के कॉलम में परिवर्तित करता हूं। सब कुछ बाईं ओर 1 पिक्सेल में स्थानांतरित हो गया है, और अंत में नई लाइन डाल दी गई है।

प्रत्येक बार जब मैं फिर से चलाता हूं, तो मैं रंग को सेट करके लूपिंग कर रहा हूं और प्रत्येक पिक्सेल को व्यक्तिगत रूप से चित्रित कर रहा हूं, जो ऐसा करने के लिए एक बेहद अक्षम तरीका है।

क्या ऐसा करने का कोई बेहतर तरीका है? क्या पिक्सेल के गुच्छा को आसानी से स्थानांतरित करने के लिए कुछ तरीका है?

+7

अपने स्पेक्ट्रोग्राम से बिटमैप क्यों न बनाएं, फिर बिटमैप को ग्लैड क्वाड के लिए बनावट के रूप में उपयोग करें? –

उत्तर

3

वे आपकी ड्राइंग गति को बेहतर बनाने के कई तरीके हैं। एक आरजीबी बनावट आवंटित करना सबसे सरल होगा जिसे आप एक स्क्रीन गठबंधन बनावट क्वाड का उपयोग करके आकर्षित करेंगे। प्रत्येक बार जब आप एक नई लाइन खींचना चाहते हैं तो आप glTexSubImage2d को लोडर के एक नए सबसेट लोड में उपयोग कर सकते हैं और फिर आप क्वाड को फिर से चला सकते हैं।

+0

ठीक है मैंने इसे समझ लिया, और ऐसा किया। एक बात जो मैं उल्लेख करना भूल गया था वह है कि मेरे पिक्सेल मान एक गोलाकार बफर में संग्रहीत होते हैं जो चीजों को थोड़ा चुनौती देते हैं, लेकिन इसका सामना किया जा सकता है। हर बार जब मैं एक लाइन जोड़ता हूं तो मैं सभी पिक्सेल से बनावट बना देता हूं, फिर इसे क्वाड के साथ उचित रूप से मानचित्रित करता हूं। मैं क्वाड में कुछ अतिरिक्त मैपिंग का उपयोग करके सर्कुलर बफर से ऑफ़सेट को आसानी से संभाल सकता हूं। इष्टतम से बहुत दूर है, लेकिन यह मेरे पास पहले की तुलना में बहुत तेज़ है। – MattRS

1

क्या आप शायद पिक्सेल के मुकाबले ग्राफिक्स कार्ड में बहुत अधिक डेटा पास कर रहे हैं? ऐसा तब हो सकता है जब आपका एफएफटी आकार ड्राइंग क्षेत्र की ऊंचाई से काफी बड़ा हो या स्पेक्ट्रल लाइनों की संख्या इसकी चौड़ाई से कहीं अधिक हो। यदि ऐसा है, तो यह संभव है कि बोतल की गर्दन बस में बहुत अधिक डेटा गुजर रही हो। उन्हें या तो औसत या स्पेक्ट्रल लाइनों की संख्या को कम करने का प्रयास करें (प्रत्येक बिन में अधिकतम पंक्तियों के सेट के लिए अधिकतम लेना)।

+0

अच्छी सलाह है, लेकिन मैं पहले से ही इसे संभालने वाला हूं। यह समस्या मेरी पूरी तरह से अक्षम ड्राइंग विधि थी। – MattRS

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन। । ।

पिक्सेल को स्टोर करने के लिए एक गोलाकार बफर का उपयोग करें, और उसके बाद उचित ऑफसेट के साथ दो बार glDrawPixels को कॉल करें। इस अनचाहे सी की तरह कुछ:

#define SIZE_X 800 
#define SIZE_Y 600 
unsigned char pixels[SIZE_Y][SIZE_X*2][3]; 
int start = 0; 

void add_line(const unsigned char line[SIZE_Y][1][3]) { 
    int i,j,coord=(start+SIZE_X)%(2*SIZE_X); 
    for (i=0;i<SIZE_Y;++i) for (j=0;j<3;++j) pixels[i][coord][j] = line[i][0][j]; 
    start = (start+1) % (2*SIZE_X); 
} 
void draw(void) { 
    int w; 
    w = 2*SIZE_X-start; 
    if (w!=0) glDrawPixels(w,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,3*sizeof(unsigned char)*SIZE_Y*start+pixels); 
    w = SIZE_X - w; 
    if (w!=0) glDrawPixels(SIZE_X,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,pixels); 
}