2012-07-24 18 views
11

मैं वर्तमान में ओपनजीएल और शेडर्स पर कुछ शोध कर रहा हूं लेकिन मुझे लगता है कि glBlendMode का उपयोग करके मिश्रण के बीच कोई मौलिक अंतर नहीं है या एक शेडर में अपना खुद का मिश्रण मोड लिख रहा है।ओपनजीएल ब्लेंड मोड बनाम शेडर ब्लेंडिंग

पूर्व या बाद वाले को चुनने के कारण क्या हैं? क्या एक दूसरे को चुनकर कोई प्रदर्शन बाधाएं हैं? या यह सिर्फ व्यक्तिगत वरीयता का मामला है?

उत्तर

13

glblendFunc के साथ पारंपरिक मिश्रण को एक शेडर में दोहराया नहीं जा सकता है। मिश्रण को संशोधित करने से पहले गंतव्य फ्रेमबफर को नमूना करने की आवश्यकता होती है, जो वर्तमान हार्डवेयर पर कुछ नहीं किया जा सकता है।

वर्तमान में आप केवल एक रंग के साथ पास कर सकते हैं, और ब्लेंडिंग मोड (glblendFunc/glblendEquation) के सीमित चयन में से एक चुन सकते हैं जिसे फ्रेमबफर को लिखने से पहले जीपीयू के रास्टरराइज़र द्वारा लागू किया जाएगा।

+1

क्या इसका मतलब यह है कि एक शेडर दो बनावट मिश्रण नहीं कर सकता है और उन्हें मिश्रण मोड लागू कर सकता है और 1 नया बनावट आउटपुट कर सकता है? मुझे लगता है कि लोग कुछ हद तक अजीब हैं अगर लोग वेब पर फ़ोटोशॉप ब्लेंड मोड शेडर्स पोस्ट कर रहे हैं। क्या आप विस्तार से बता सकते हैं? धन्यवाद! – polyclick

+0

नहीं, आप अभी भी एक शेडर में दो बनावट मिश्रण कर सकते हैं, लेकिन यह मिश्रण नहीं है। मिश्रण वर्तमान पिक्सेल फ्रेमबफर के साथ मिश्रण करता है। आप अभी भी अन्य माध्यमों (बनावट और मिश्रण करने के लिए ड्राइंग) द्वारा एक ही प्रभाव प्राप्त कर सकते हैं। @bartcla – Tim

+0

ठीक है, तो अगर मैं सही ढंग से समझता हूं: 'glblendFunc' के माध्यम से मिश्रण एक शेडर में बनावट मिश्रण से बिल्कुल अलग है? मान लें कि मैं दो फोटो को "गुणा" मिश्रण मोड के साथ मिश्रित करना चाहता हूं। यह 'glblendFunc' का उपयोग करने के बजाए एक शेडर में किया जाना चाहिए? क्या आप एक उदाहरण दे सकते हैं जहां 'glblendFunc' का उपयोग किया जाता है? – polyclick

1

यह संभव है अनुकरण करने के लिए ओपन तीन परिस्थितियों में एक शेडर के भीतर से सम्मिश्रण मैं के बारे में पता कर रहा हूँ:

  1. आप Direct3D11 या ओपन बराबर है, और आप एक पढ़ने-लिखने की बनावट के रूप में लक्ष्य प्रस्तुत करना बाँध अपने पिक्सेल शेडर में। यह मनमाने ढंग से जटिल मिश्रण परिचालन को सक्षम बनाता है, लेकिन सरल मिश्रण करते समय उच्च प्रदर्शन नहीं होगा, क्योंकि आप सरल जीपीयू के विशेष हार्डवेयर को सरल मिश्रण के लिए बाईपास कर रहे हैं।

  2. आपके पास एक विदेशी "टाइल-आधारित" जीपीयू है जहां "अल्फा शेडर" द्वारा भी सरल मिश्रण किया जाता है। इस मामले में, ओपनजीएल और समकक्ष शेडर कोड में एक साधारण मिश्रण के बीच कोई प्रदर्शन अंतर नहीं है। लेकिन यह संभावना नहीं है कि आपके पास ऐसा GPU है, और ओपनजीएल इस कार्यक्षमता का पर्दाफाश नहीं करता है।

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

+0

1: उल्लेख नहीं है, यदि एकाधिक शेडर इनवोकेशन समान पिक्सेल तक पहुंचते हैं तो आपको स्पष्ट रूप से सिंक्रनाइज़ करने का उपयोग करना होगा। –

+0

टाइल वाले रास्टरराइजेशन का एक अच्छा पहलू यह है कि आमतौर पर, पिक्सेल के बीच दौड़ की स्थिति की कोई संभावना नहीं होती है। लेकिन, अगर आप इसके बारे में 1 के बारे में बात कर रहे थे तो हाँ आप सही हैं: त्रैमासिक रास्टराइजेशन को पूरा करने की गारंटी उस मामले में उल्लंघन की जाएगी। – bmcnett

6

जब कोई शेडर एक बनावट से पढ़ता है, जबकि यह एक ही बनावट को एक साथ प्रस्तुत करता है, तो परिणाम अनिर्धारित होते हैं। यही कारण है कि GlBlendFunc और glBlendEquation के साथ "पारंपरिक" या निश्चित-कार्यक्षमता मिश्रण उपयोगी है।

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

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

आधुनिक हार्डवेयर पर, दोनों तकनीकों के बीच का अंतर छोटा होता है।

0

यह वास्तव में gl 3 का उपयोग करके पूरा किया जा सकता है।बनावट बाधा समारोह का उपयोग कर 0 विस्तार:

http://www.opengl.org/registry/specs/NV/texture_barrier.txt

मूल रूप से, आप पृष्ठभूमि लिखने के बाद, आप TextureBarrierNV() फ़ंक्शन यकीन texels हो सकता है प्लावित कर रहे हैं, तो आप एक में पढ़ने/लिखने आपरेशन प्रदर्शन कर सकते हैं एकल शेडर चरण (मल्टीसाम्प्लिंग बफर से बचने के लिए सुनिश्चित करें क्योंकि केवल एक लिखने के लिए ऑपरेशन की अनुमति है) ..

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

  • कोई संबंधित समस्या नहीं^_^