Ddx (hlsl) वास्तव में क्या करता है?


17

मैं थोड़ा उलझन में हूँ। आधिकारिक दस्तावेज ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) का कहना है कि ddx (इनपुट) सम्मान के साथ इनपुट का आंशिक व्युत्पन्न है "स्क्रीन-स्पेस एक्स-कोऑर्डिनेट।"

मेरा पथरी ठीक है, लेकिन यह कैसे बता सकता है कि इनपुट क्या आ रहा है? अगर मैंने इसे एक फ़ंक्शन पास किया, तो ठीक है, मैं सोच सकता हूं कि यह क्या करेगा, लेकिन एक संख्या का व्युत्पन्न हमेशा शून्य होता है ...?

क्या यह सिर्फ एक स्केलिंग है? जैसे, यह इस दूरी पर अपने आकार के दसवें हिस्से तक बढ़ जाएगा, इसलिए यह एक दसवां रिटर्न देता है? लेकिन तब इसे इनपुट की जरूरत नहीं होती ...

क्या कोई वास्तव में क्या हो रहा है इसका त्वरित स्पष्टीकरण दे सकता है?


2
ddxऔर ddyऐसा जादू करो कि तुम खुद नहीं कर सकते। उनके पास रैस्टराइज़ेशन पाइपलाइन से अतिरिक्त जानकारी तक पहुंच है जिसे आप पिक्सेल shader के भीतर से प्राप्त नहीं कर सकते। मैं अनिश्चित हूं कि वे किस सूत्र का उपयोग करते हैं; मुझे विश्वास है कि वे एक अनुमान तकनीक का उपयोग करने के लिए नेतृत्व किया गया है, लेकिन मुझे यकीन नहीं है।
सीन मिडलिचच

यह गहरा अजीब है, लेकिन अभी भी है। Ddx (5) वास्तव में क्या दर्शाता है? अगर यह कहता है ।1, मुझे इसकी व्याख्या कैसे करनी चाहिए? या 6?
रिचर्ड रस्त

1
ddx(5)व्यर्थ की तरह है। एक इनपुट वैल्यू के साथ इसका उपयोग करें, और यह आपको एक ब्लॉक में पड़ोसी पिक्सल के संबंध में उस मूल्य का व्युत्पन्न देगा। फिर से, मुझे नहीं पता कि यह कितनी सटीक रूप से मूल्यों की गणना करता है, लेकिन एक गैर-इनपुट के व्युत्पन्न के लिए पूछना अच्छी तरह से अपरिभाषित व्यवहार हो सकता है और कचरा पैदा कर सकता है। अधिक जानकारी के लिए fgiesen.wordpress.com/2011/07/10/… देखें जो मैं प्रदान कर सकता हूं।
सीन मिडलिचच

मुझे यकीन नहीं है, लेकिन यह अच्छी तरह से हो सकता है कि एचएलएसएल संकलक वास्तव में उस अभिव्यक्ति का पूर्ण प्रतीकात्मक भेदभाव कर रहा है जिसे आप ddx / ddy में पास करते हैं। blogs.msdn.com/b/chuckw/archive/2011/03/08/… research.microsoft.com/pubs/146019/…
Ziriax

यह क्या करता है? केवल थोड़ा उचित बात है, जाहिर है।
मिकेल

जवाबों:


32

आंतरिक रूप से, GPUs एक समय में पिक्सेल shader का एक उदाहरण कभी नहीं चलाते हैं। दानेदारता के बेहतरीन स्तर पर, वे हमेशा एक सिमड आर्किटेक्चर का उपयोग करके एक ही समय में 32-64 पिक्सेल चला रहे हैं। इसके भीतर, पिक्सल को 2x2 क्वैड में व्यवस्थित किया जाता है, इसलिए SIMD वेक्टर में लगातार 4 पिक्सेल का प्रत्येक समूह स्क्रीन पर पिक्सल के 2x2 ब्लॉक से मेल खाता है।

किसी क्वाड में पिक्सल के बीच अंतर लेने से डेरिवेटिव की गणना की जाती है। उदाहरण के लिए, ddxदाईं ओर के मानों से क्वाड के बाईं ओर के पिक्सल में मान ddyघटाएंगे , और नीचे के पिक्सल को ऊपर वाले से घटाएंगे। फिर अंतर को क्वाड में सभी चार पिक्सेल के व्युत्पन्न के रूप में वापस किया जा सकता है।

चूंकि SIMD में पिक्सेल शेडर चल रहा है, इसलिए यह गारंटी दी जाती है कि क्वाड के सभी पिक्सल के लिए समान मूल्य एक ही रजिस्टर में है। तो जो कुछ भी अभिव्यक्ति या मूल्य आप में डाल दिया ddxया ddy, यह ट्रैक्टर के सभी चार पिक्सल में मूल्यांकन किया जाएगा, तो अलग पिक्सल से मूल्यों के रूप में ऊपर वर्णित घटाया।

इसलिए एक स्थिर मूल्य का व्युत्पन्न लेना शून्य देगा (जैसा कि आप पथरी से उम्मीद करेंगे, ठीक है?) क्योंकि यह सभी चार पिक्सेल में समान स्थिर मूल्य है।

यह भी ध्यान दें कि "मोटे" और "ठीक" डेरिवेटिव, ddx_coarse/ ddy_coarseऔर ddx_fine/ हैं ddy_fine। भेद की व्याख्या यहाँ दी गई है । सिर्फ मोटे ddx/ ddyमोटे संस्करणों के लिए उपनाम हैं।

BTW, इस कार्यशीलता के मौजूद होने का कारण यह है कि GPUs आंतरिक रूप से बनावट निर्देशांक लेने के लिए है ताकि mipmap चयन और anisotropic फ़िल्टरिंग किया जा सके। चूँकि हार्डवेयर को वैसे भी क्षमता की आवश्यकता होती है (आप किसी shader में बनावट निर्देशांक के लिए किसी भी मनमाने ढंग से अभिव्यक्ति का उपयोग कर सकते हैं), यह काफी आसान था इसे सीधे shader प्रोग्रामर को भी एक्सपोज़ कर सकता है।


+1; बनावट के लिए एक गड़बड़ी प्रभाव लागू करते समय मैंने इसे उपयोगी पाया है; विकृत टेक्सकोर्ड्स ने कुछ रंग विकृति दी, लेकिन मूल (unperturbed) टेक्सकोर्ड्स से डेरिवेटिव के साथ टेक्स 2 डग्रेड का उपयोग करने से एक परिणाम नहीं मिला।
मैक्सिमस मिनिमस

ठीक है, कुछ सोच के बाद मुझे लगता है कि मुझे अपनी उलझन का पता चल गया। मेरे दिमाग में, ddxपारंपरिक प्रोग्रामिंग भाषा में हर दूसरे फ़ंक्शन की तरह काम करता है; आप इनपुट का मूल्यांकन करते हैं, इसे एक फ्लोट या जो भी मोड़ते हैं, उसके बाद बाहरी फ़ंक्शन ( ddx) को करते हैं। लेकिन यह अलग है- यह इनपुट स्ट्रिंग लेता है , कई स्थानों पर इसका मूल्यांकन करता है, एक व्युत्पन्न की गणना करता है, और परिणाम की रिपोर्ट करता है। क्या यह सही है?
रिचर्ड रैस्ट

1
@ रायचर्ड राइट आप मूल्य के बजाय उस अभिव्यक्तिddx में काम करने के बारे में सोच सकते हैं, जो आप इसमें पास करते हैं ।
नाथन रीड

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

नाथन रीड ने उल्लेख किया है कि जीपीयू इन कार्यों का उपयोग mipmap चयन के लिए करता है। आप GPU का उपयोग करने के लिए वांछित mipmap स्तर का चयन करने या कलाकृतियों को गलत mip-level चयन से रोकने के लिए भी उनका उपयोग कर सकते हैं। इस प्रक्रिया का वर्णन Shader X3 के पृष्ठ 163 और 164 पर किया गया है।
जेम्सहॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.