2012-06-25 11 views
8

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

मुझे डायरेक्टएक्स 11 की मूल बातें मिल रही हैं और चल रही हैं, और अब मैं कुछ मजा ले रहा हूं। तो स्वाभाविक रूप से मैं शेडर पाइपलाइन में भारी पढ़ रहा हूं, और मैं पहले से ही मोहक हूं। कोड का एक सरल, छोटा टुकड़ा लिखने का विचार जिसे संसाधनों को बर्बाद किए बिना एक सेकंड के हर 60 वें स्थान पर हजारों बार चलाने के लिए पर्याप्त कुशलता होनी चाहिए, मुझे जारी रखने से पहले अवधारणा को समझने में जल्दी और मुझे गड़बड़ करने से पहले की चीज़ों का। मुझे जो परेशानी हो रही है वह है कि पिक्सेल शेडर वास्तव में क्या कर रहा है।

वर्टेक्स shaders को समझने के लिए, आप एक समान डेटा संरचनाओं कि इसके बारे में जानकारी संबंधित हैं, स्थिति और बनावट निर्देशांक की तरह में एक वस्तु का कोने का आयोजन, और फिर शेडर में प्रत्येक शिखर पारित सरल 3 डी द्वारा 2D पर से परिवर्तित हो रहे हैं trasformation matrices का रास्ता। जब तक मैं इसे समझता हूं, मैं इसे कोड करने के तरीके के बारे में बता सकता हूं।

लेकिन मुझे पिक्सेल शेडर्स नहीं मिलते हैं। मुझे क्या मिलता है कि कशेरुक शेडर का उत्पादन पिक्सेल शेडर का इनपुट है। तो क्या यह सिर्फ पॉलीगॉन के शीर्षकों के 2 डी निर्देशांक पिक्सेल शेडर को सौंपना नहीं होगा? मुझे समझने के लिए क्या आया है कि पिक्सेल शेडर व्यक्तिगत पिक्सेल प्राप्त करता है और रंग और प्रकाश जैसी चीज़ों को निर्धारित करने के लिए उन पर गणना करता है। लेकिन अगर यह सच है, तो कौन से पिक्सेल? पूरी स्क्रीन या केवल पिक्सल जो परिवर्तित 2 डी बहुभुज के भीतर स्थित हैं?

या क्या मैंने पूरी तरह से कुछ गलत समझा है?

उत्तर

10

वर्टेक्स shaders को समझने के लिए आसान है, आप एक समान डेटा संरचनाओं कि इसके बारे में जानकारी संबंधित हैं, स्थिति और बनावट निर्देशांक की तरह में एक वस्तु का कोने का आयोजन, और फिर शेडर में प्रत्येक शिखर पारित 3 डी से करने के लिए परिवर्तित किया Trasformation matrices के माध्यम से 2 डी।

इस के बाद, पुरातन (त्रिकोण या त्रिकोण के गुणज) उत्पन्न होते हैं और (काटा Direct3D 11 में कर रहे हैं, यह वास्तव में प्रतिक्रिया, ज्यामिति shaders, tesselation को बदलने के लिए एक छोटे से अधिक जटिल धन्यवाद है, तो आप इसे नाम ... लेकिन जो कुछ भी है, अंत में आपके पास त्रिकोण है)।

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

अंत में, इन सभी "कार्यों", पर एक छोटा सा प्रोग्राम निष्पादित किया जाता है, यह पिक्सेल शेडर (या टुकड़ा शेडर) है।

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




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

+0

ठीक है, मुझे लगता है कि अब मैं समझता हूं। क्योंकि मैं एक दृश्य शिक्षार्थी हूं, हालांकि, मैंने जो वर्णन किया है उसका चित्र मैंने बनाया है, इसलिए कृपया मुझे बताएं कि मुझे कुछ याद आ रहा है या नहीं। http://postimage.org/image/9oy2nroqr/ – FatalCatharsis

+1

एक गलती: पोस्ट-वर्टेक्सशेडर निर्देशांक ** ** पिक्सेल निर्देशांक नहीं हैं, लेकिन _normalized_। डायरेक्ट 3 डी के लिए इसका मतलब है कि वे 0.0 और 1.0 (ओपनजीएल में -1.0 और 1.0) के बीच हैं। यह पहली बार बहुत सहज नहीं है, क्योंकि स्क्रीन आमतौर पर वर्ग नहीं होती है, लेकिन यह "बस काम करती है" (कोई चिंता नहीं, आपके लिए कुछ खास नहीं है!) और हार्डवेयर में गणना करने के लिए यह अधिक कुशल है (उदाहरण के लिए क्लिपिंग) अंतरिक्ष। बाकी अच्छा दिखता है (geom shader, tesselation, और क्लिपिंग को "सामान जो बीच में होता है" के रूप में जाना जाता है)। – Damon

+0

आह होचा, मैं वास्तव में सामान्यीकृत निर्देशांक पसंद करता हूं, क्योंकि सबकुछ एक ही पैमाने पर होगा, चाहे आपका चुने हुए स्क्रीन रिज़ॉल्यूशन चाहे, (ओपनग्ल थोड़ा अजीब लगता है, -1 से 1)। तो ज्यामिति शेडर और टेस्सेलेशन चरणों के बीच में होता है? मुझे लगता है कि वे पहले आते हैं क्योंकि नए शिखर को कशेरुक शेडर में खिलाया जा सकता है और स्क्रीन कॉर्ड में परिवर्तित किया जा सकता है। नए बनाए गए हैं जो स्वचालित रूप से बनाए गए हैं 2 डी? – FatalCatharsis

2

पिक्सेल शेडर्स की आपकी समझ सही है कि यह "व्यक्तिगत पिक्सल प्राप्त करती है और रंग और प्रकाश जैसी चीज़ों को निर्धारित करने के लिए उनकी गणना करती है।"

शेडर प्राप्त पिक्सल व्यक्तिगत रूप से परिवर्तित 2 डी बहुभुज (त्रिभुज विशिष्ट होने के) के रास्टरराइजेशन के दौरान गणना की जाती है। इसलिए जबकि कशेरुक शेडर त्रिभुज के 3 बिंदुओं को संसाधित करता है, पिक्सेल शेडर एक समय में पिक्सल को संसाधित करता है, जो त्रिकोण में "भरें" होता है।

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