फ़ोकस क्या है और यह कैसे काम करता है?


18

ओपन प्रलेखन कहा गया है कि fwidth returns the sum of the absolute value of derivatives in x and y

कम गणितीय शब्दों में इसका क्या मतलब है, और क्या यह कल्पना करने का एक तरीका है?

फ़ंक्शन की मेरी समझ के आधार पर, पड़ोसी पिक्सल में fwidth(p)मूल्य तक पहुंच है p। यह GPU पर अत्यधिक प्रभाव डाले बिना कैसे काम करता है, और क्या यह सभी पिक्सेल में विश्वसनीय और समान रूप से काम करता है?

जवाबों:


18

पिक्सेल स्क्रीन अंतरिक्ष डेरिवेटिव करते तो दृश्य वे मुक्त की एक निश्चित बिंदु से काफी प्रभाव प्रदर्शन, पर वे प्रदर्शन को प्रभावित करते हैं तो उन्हें उपयोग करने या न,!

हाल के इतिहास में हर GPU एक साथ चार पिक्सेल का एक पैकेट पैक करता है और उन्हें एक ही ताना / तरंग में डालता है, जिसका अनिवार्य रूप से मतलब है कि वे GPU पर एक दूसरे के ठीक बगल में चल रहे हैं, इसलिए उनसे मूल्यों तक पहुंचना बहुत सस्ता है। चूँकि लॉकस्टेप में वॉर / वेवफ्रंट्स चलाए जाते हैं, दूसरे पिक्सल्स भी आप की तरह ही शैडर में एक ही जगह पर होंगे, इसलिए pउन पिक्सल्स का मूल्य सिर्फ आपके इंतजार में एक रजिस्टर में बैठा होगा। इन अन्य तीन पिक्सेल को हमेशा निष्पादित किया जाएगा, भले ही उनके परिणाम फेंक दिए जाएं। तो एक त्रिभुज जो एक एकल पिक्सेल को कवर करता है, हमेशा चार पिक्सेल छाया देगा और उनमें से तीन के परिणाम निकाल देगा, बस इतना है कि ये व्युत्पन्न सुविधाएँ काम करती हैं!

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

जहाँ तक कम गणितीय शब्दों में इसका अर्थ है: fwidthके बराबर है abs(dFdx(p)) + abs(dFdy(p))dFdx(p)बस pपिक्सेल x + 1 के मूल्य और पिक्सेल x के मूल्य के बीच का अंतर है p, और इसी तरह के लिए dFdy(p)


तो, अगर dFdx(p) = p(x1) - p(x), तो या तो x1हो सकता है (x+1)या (x-1), xक्वाड में पिक्सेल की स्थिति पर निर्भर करता है । किसी भी तरह से, x1एक ही ताना / लहर के रूप में होना चाहिए x। क्या मैं सही हूँ?
अपूर्वाज

3
@ApoorvaJ अनिवार्य रूप dFdxसे 2x2 ग्रिड में 2 पड़ोसी पिक्सल में से प्रत्येक के लिए समान मूल्य की गणना की जाती है। और यह मान सिर्फ दो पड़ोसी मूल्यों के बीच के अंतर का उपयोग करके गणना की जाती है, यदि वह है p(x+1)-p(x)या p(x)-p(x-1)बस आपकी धारणा पर निर्भर करता xहै कि यहां क्या है। परिणाम हालांकि वही है। तो हाँ, आप सही हैं।
क्रिस कहते हैं मोनिका

@ChristianRau मेरे सवाल का जवाब देता है। धन्यवाद।
अपूर्वराज

11

पूरी तरह से तकनीकी शब्दों में, fwidth(p)के रूप में परिभाषित किया गया है

fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))

और dFdx(p)/dFdy(p) और स्क्रीन आयामों के pसंबंध में मूल्य के आंशिक व्युत्पन्न हैं । इसलिए वे निरूपित करते हैं कि एक पिक्सेल को दाईं ओर ( ) या एक पिक्सेल ऊपर ( ) में जाने पर व्यवहार का मूल्य कैसे होता है ।xypxy

अब वे व्यावहारिक रूप से कैसे गणना कर सकते हैं? ठीक है, अगर आप पड़ोसी के पिक्सल के मूल्यों को जानते हैंp सीधे उन व्युत्पन्न अंतरों की गणना कर सकते हैं जो कि उनके वास्तविक गणितीय व्युत्पत्ति के लिए एक अनुमान के रूप में प्रत्यक्ष परिमित अंतर हैं (जिनका सटीक विश्लेषणात्मक समाधान नहीं हो सकता है):

dFdx(p) := p(x+1) - p(x)

लेकिन निश्चित रूप से अब आप पूछ सकते हैं, हम pपड़ोसी के पिक्सल के लिए ( यहां तक ​​कि shader प्रोग्राम के अंदर किसी भी मनमाने ढंग से गणना किए गए मूल्य के मूल्य को कैसे जान सकते हैं) भी जानते हैं ? हम पूरे शैडर की गणना दो (या तीन) बार करके प्रमुख ओवरहेड के बिना उन मूल्यों की गणना कैसे करते हैं?

ठीक है, आप जानते हैं कि, उन पड़ोसी मूल्यों को किसी भी तरह से गणना की जाती है, क्योंकि पड़ोसी पिक्सेल के लिए आप एक टुकड़ा शेडर भी चलाते हैं। इतना सब कुछ है कि आप की जरूरत है जब पड़ोसी पिक्सेल के लिए चलाने के लिए इस पड़ोसी टुकड़ा shader आह्वान है। लेकिन यह और भी आसान है, क्योंकि उन पड़ोसी मूल्यों की गणना भी उसी समय की जाती है।

आधुनिक रैस्टरएज़र एक से अधिक पड़ोसी पिक्सल के बड़े टाइलों में टुकड़े टुकड़े करते हैं। सबसे छोटे वे पिक्सल के 2x2 ग्रिड होंगे। और इस तरह के प्रत्येक पिक्सेल के लिए प्रत्येक पिक्सेल के लिए खंड shader को लागू किया जाता है और उन चालानों को चलाया जाता है )। तो किसी भी समय, एक टुकड़ा shader सैद्धांतिक रूप से अपने पड़ोसी पिक्सल के टुकड़े shader मूल्यों तक पहुँच प्राप्त करता है। और जब आप उन मूल्यों के लिए सीधी पहुँच नहीं है, आप व्युत्पन्न कार्यों की तरह उन लोगों से गणना की मूल्यों की भी पहुंच , , , ... को पूरी तरह से समानांतर लॉक-स्टेप में जाता है ताकि सभी गणना सटीक उसी क्रम में और ब्लॉक में प्रत्येक पिक्सेल के लिए सटीक एक ही समय में हो सकें। (यह भी कि क्यों टुकड़े टुकड़े में शाखाओं में बँधना, जबकि घातक नहीं है, यदि संभव हो तो बचा जाना चाहिए, क्योंकि ब्लॉक के प्रत्येक आह्वान को प्रत्येक शाखा का पता लगाना होगा जो कम से कम एक आक्रमण द्वारा लिया जाता है, भले ही वह बस दूर हो जाए। परिणाम बाद में, जैसा कि इस संबंधित प्रश्न के उत्तर में भी दर्शाया गया हैdFdxdFdyfwidth

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.