2012-05-17 13 views
8

बनावट स्मृति मैं निम्नलिखित कोड भर में आ गए हैं का उपयोग करते समय: -बनावट स्मृति-tex2D मूल बातें

uint f = (blockIdx.x * blockDim.x) + threadIdx.x; 
uint c = (blockIdx.y * blockDim.y) + threadIdx.y; 

uint read = tex2D(refTex, c+0.5f, f+0.5f); 

मेरा प्रश्न क्यों हम c और f दोनों को 0.5f में शामिल कर सकता है? .. यह मैं confuses thankyou

उत्तर

14

ग्राफिक्स में, एक बनावट नमूने का एक सेट है जो सतह की दृश्य उपस्थिति का वर्णन करती है। एक नमूना एक बिंदु है। यही है, इसका कोई आकार नहीं है (जैसा कि एक पिक्सेल के विपरीत है जिसमें भौतिक आकार है)। पिक्सेल के रंगों को निर्धारित करने के लिए नमूने का उपयोग करते समय, प्रत्येक नमूना अपने संबंधित पिक्सेल के सटीक केंद्र में स्थित होता है। पूरे नंबर निर्देशांक के साथ पिक्सेल को संबोधित करते समय, दिए गए पिक्सेल के लिए सटीक केंद्र इसकी संपूर्ण संख्या समन्वय और 0.5 (प्रत्येक आयाम में) का ऑफसेट बन जाता है।

दूसरे शब्दों में, बनावट कोऑर्डिनेट्स में 0.5 जोड़ना सुनिश्चित करता है कि, उन निर्देशांकों से पढ़ते समय, उस पिक्सेल के नमूने का सटीक मान वापस कर दिया जाता है।

हालांकि, यह तभी होता है जब बनावट के लिए filterModecudaFilterModeLinear कि मूल्य है कि एक बनावट से पढ़ी जाती है एक पिक्सेल के भीतर भिन्न होता है करने के लिए सेट किया गया है। उस मोड में, समन्वय से पढ़ना जो पिक्सेल के सटीक केंद्र में नहीं हैं वे मान दिए गए पिक्सेल के लिए नमूना और पड़ोसी पिक्सल के नमूने के बीच इंटरपोलेट किए गए मान। इसलिए, पूरे संख्या निर्देशांक में 0.5 जोड़ना प्रभावी ढंग से cudaFilterModeLinear मोड को अस्वीकार करता है। लेकिन, बनावट कोऑर्डिनेट्स में 0.5 जोड़ना कर्नेल में चक्र लेता है, इसलिए filterMode को cudaFilterModePoint पर सेट करके इंटरपोलेशन को बंद करना बेहतर होता है। फिर, किसी पिक्सेल के भीतर किसी भी समन्वय से पढ़ने से उस पिक्सेल के लिए सटीक बनावट नमूना मान लौटाता है, और इसलिए, बनावट नमूने सीधे पूर्ण संख्याओं का उपयोग करके पढ़ा जा सकता है।

जब cudaFilterModePoint का उपयोग कर, यदि कोई चल बिन्दु गणित बनावट निर्देशांक की गणना में शामिल है, देखभाल सुनिश्चित करना है कि चल बिन्दु अशुद्धियों का कारण नहीं है बनावट अभीष्ट लक्ष्य पिक्सेल के लिए सीमा के बाहर गिर निर्देशांक लिया जाना चाहिए।

इसके अलावा, जैसा कि टिप्पणियों का उल्लेख है, आपके कोड में कोई समस्या हो सकती है। बनावट निर्देशांक में 0.5 एफ जोड़ना तात्पर्य है कि cudaFilterModeLinear मोड का उपयोग किया जा रहा है, लेकिन वह मोड एक फ्लोट देता है, न कि int।

+0

आपने कहा कि बनावट निर्देशांक के लिए वास्तव में एक पिक्सेल केंद्र को इंगित किया जाता है, इसलिए यदि हम 0,0 निर्देशांक के साथ तत्व तक पहुंच सकते हैं और अपनी योजना का उपयोग करते हैं तो हमें 1,1 पिक्सेल मिलता है। – geek

+0

@ marina.k: मुझे यकीन नहीं है कि आपका क्या मतलब है। क्या उत्तर के साथ कोई समस्या है? –

+0

@ रोगर डाहल धन्यवाद, बहुत अच्छा जवाब। लेकिन क्या आप विस्तारित कर सकते हैं जब आप कहते हैं कि फ़्लोटिंग पॉइंट त्रुटियों से सह समन्वय लक्षित लक्ष्य पिक्सेल के लिए सीमा के बाहर गिरने का कारण बन सकते हैं? आप का मतलब क्या है? –

0

बनावट गुण के आधार पर, tex2D द्वारा दिए गए मान रैखिक अंतर्वेशित जा सकता है। "सूचकांक" f और c इसलिए पूर्णांक नहीं हैं, लेकिन प्रत्येक आयाम की सीमाओं के बीच निरंतर मूल्य हैं।

इस उदाहरण में थोड़ा अजीब बात यह है कि रिटर्न वैल्यू एक पूर्णांक है, जो किसी भी रैखिक इंटरपोलेंट को किसी भी तरह से स्थिर बना देगा।

अधिक विस्तृत जानकारी के लिए, CUDA प्रोग्रामिंग मार्गदर्शिका की धारा 3.2.10 देखें।

+0

"' cudaFilterModeLinear' केवल फ़्लोटिंग-पॉइंट प्रकार के लौटाए गए मानों के लिए मान्य है। ", इसलिए यहां हमारे पास इंटरपोलेशन नहीं हो सकता है, केवल 'cudaFilterModePoint' – aland

+0

@aland: यह सही है, लेकिन हम नहीं जानते कि किस प्रकार 'refTex' घोषित किया गया था, यानी' फ्लोट' या 'int' या जो भी हो। – Pedro

+0

यदि हम 0.0 से 1.0 तक समन्वय का उपयोग नहीं करते हैं तो यह 'cudaFilterModePoint' – geek

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