2010-12-07 11 views
6

मैं सोच रहा था कि लक्षित फ्रेमबफर से पिक्सेल मान को पढ़ने के लिए नए शेडर मॉडल में समर्थन है या नहीं। मुझे लगता है कि इस alrdy बाद में (गैर प्रोग्राम) ड्राइंग पाइप लाइन में चरणों जो बनाया मुझे उम्मीद है कि इस सुविधा से प्रोग्राम पाइप लाइन में जोड़ दिया गया है हो सकता है में किया जाता है।शेडर फ्रेमबफर रीडबैक

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

उत्तर

4

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

यदि फ्रेमबफर को पढ़ने के लिए टुकड़े शेडर के लिए कोई रास्ता था, तो यह सुनिश्चित करने के लिए कुछ प्रकार की सिंक्रनाइज़ेशन की आवश्यकता होगी कि जो लोग पढ़ते हैं, इस प्रकार चीजें बहुत धीमी हो जाती हैं।

3

नहीं। आप का उल्लेख के रूप में, एक बनावट के लिए प्रतिपादन तरीका है कि कार्यक्षमता प्राप्त करने के लिए है।

आप एक GPU पाइपलाइन के एक ब्लॉक आरेख पर एक नज़र डालें, तो आप देखेंगे कि सम्मिश्रण चरण - जो क्या फ्रेमबफर साथ टुकड़ा शेडर उत्पादन को जोड़ती है - टुकड़ा शेडर से अलग है और निश्चित कार्य है।

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

(नहीं उल्लेख करने के लिए है कि अचल समारोह सम्मिश्रण "पर्याप्त" है ज्यादातर मामलों में।)

1

वास्तव में मुझे लगता है कि यह अब Direct3D 11 SM 5.0 के साथ करने योग्य है (मैंने हालांकि इसका परीक्षण नहीं किया था)।

विधि OMSetRenderTargetsAndUnorderedAccessViews का उपयोग करके आप इसे पढ़ने और लिखने के संचालन की अनुमति देने के लिए पीएस 5.0 में एक यूएवी बांध सकते हैं।

उस स्थिति में स्वैप श्रृंखला का बैकबफर जिसे आप प्रस्तुत करते हैं उसे ध्वज DXGI_USAGE_UNORDERED_ACCESS (मुझे लगता है) के साथ बनाया जाना है।

यह DXSDK OIT11 नमूने में प्रयोग किया जाता है।

0

आप एक बनावट टेक्स (एक रेंडर लक्ष्य दृश्य का उपयोग करके) पर आकर्षित कर सकते हैं और फिर उसे किसी अन्य शेडर (शेडर संसाधन दृश्य का उपयोग करके) के रूप में बाध्य कर सकते हैं। टेक्स तब एक pseduo-framebuffer है।

1

Shader_framebuffer_fetch एक्सटेंशन के साथ खंड शेडर में फ्रेम बफर की सामग्री को वापस पढ़ना संभव है। कुछ प्रदर्शन हानि के साथ जीपीयू में समर्थन जोड़ा जा सकता है। असल में, आजकल मैं उपभोक्ता इलेक्ट्रॉनिक्स बाजार में एक प्रसिद्ध जीपीयू ब्रांड के ओपनजीएल ES2.0 ड्राइवर में इस एक्सटेंशन का समर्थन जोड़ने के लिए काम कर रहा हूं।