2013-12-18 12 views
6

वेबग्ल का उपयोग करके मुझे अपने दृश्य को प्रस्तुत करने के लिए 3 पास करने की आवश्यकता है। प्रत्येक पास एक ही ज्यामिति और शेडर्स चलाता है लेकिन कुछ वर्दी और बनावट के लिए अलग-अलग मूल्य होते हैं।वर्दी बदलने या प्रोग्राम बदलने के लिए बेहतर है?

मुझे लगता है कि दो विकल्प हैं। एक एकल कार्यक्रम "और" प्रत्येक पास के लिए सभी वर्दी और बनावट सेट करें। या 3 "कार्यक्रम" प्रत्येक में एक ही शेडर्स होते हैं, और प्रति कार्यक्रम एक बार सभी आवश्यक वर्दी/शेडर्स सेट करते हैं, और फिर प्रत्येक पास के लिए प्रोग्राम स्विच करते हैं। इसका मतलब यह है कि मैं एक प्रयोग करूँगा मैन सेट के बजाय प्रति पास प्रोग्राम कॉल प्रति पास प्रत्येक पास के लिए निर्दिष्ट कॉल।

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

क्या एक तकनीक को दूसरे पर पसंद करने का कोई कारण है?

+1

मेरा मानना ​​है कि स्विचिंग प्रोग्राम तेजी से होंगे लेकिन मुझे यकीन नहीं है। ओपनजीएल ईएस 3 में।0 उन्होंने वर्दी के संग्रह, 'वर्दी बफर ऑब्जेक्ट' जोड़े, ताकि आप सभी वर्दी को ब्लॉक में सेट कर सकें और फिर एक कॉल में वर्दी के पूरे ब्लॉक को लागू कर सकें। मेरी समझ यह है कि कुछ ड्राइवरों ने कार्यान्वित किया है कि वर्ड के प्रत्येक ब्लॉक के लिए आंतरिक रूप से कई कार्यक्रमों को संग्रहीत करके हुड के तहत। साथ ही यह संभवतः ड्राइवर पर निर्भर करता है जो तकनीक तेज है। ड्राइवर में सामान्य कम कॉल में बेहतर है। – gman

+0

धन्यवाद, मुझे यह जोड़ना चाहिए कि मैंने दोनों कोशिश की है और मेरे आवेदन में अंत में थोड़ा मापनीय अंतर प्रतीत होता है। धन्यवाद। – jcoder

उत्तर

2

यदि शेडर प्रोग्राम समान हैं तो ग्लूनिफ़ॉर्म के माध्यम से बस अलग-अलग मान भेजें।

कार्यक्रमों के बीच स्विचिंग आम तौर पर वर्दी के परिवर्तन मूल्य से धीमी है। वैसे भी उबेर शेडर कार्यक्रम (अधिकांश मामलों में उपयोग की तरह वर्दी की सूची के साथ, उपयोग एल्फामैप) अच्छी नहीं है।

@gman हम वेबजीएल (जीएलएस 2.0) के बारे में बात कर रहे हैं जहां हमारे पास यूबीओ नहीं है। (वर्दी बफर ऑब्जेक्ट)

@top सम्मिलन शेडर प्रोग्राम को पुनर्निर्मित करने से बचने का प्रयास करें (लेकिन यह दुनिया का अंत नहीं है) और एक uber शेडर न बनाएं!

+0

ठीक है, यही वह है जो मैं अब कर रहा हूं। आपके पोस्ट के लिए शुक्रिया। कारण मैंने पूछा था कि मेरे पास एक ही शेडर है लेकिन प्रत्येक पास के लिए पुनर्निर्मित करने के लिए बड़ी संख्या में बनावट हैं। प्रैक्टिस में ऐसा कोई फर्क नहीं पड़ता जो मैं करता हूं। – jcoder

1

आप बनावट की बड़ी amouts rebind करने होते हैं, तो बनावट atlasing, सबसे तेजी से समाधान किया जाना चाहिए ताकि आप बनावट rebind करने की जरूरत नहीं है, कार्यक्रमों rebind करने की जरूरत नहीं है। टेक्सकोर्ड ऑफ़सेट का प्रतिनिधित्व करने वाली वर्दी को संशोधित करके बनावट को स्विच किया जा सकता है।

संशोधन करना इस तरह की वर्दी आगे भी अनुकूलित किया जा सकता है:

आप विशेषताओं को अक्सर संशोधित वर्दी ले जाने पर विचार करना चाहिए। प्रयोक्ता उनके डेटा स्रोत को attribPointers का उपयोग करके प्रदान किया जाता है लेकिन जब आप अक्षम होते हैं तो आप निरंतर मानों का भी उपयोग कर सकते हैं। UnformXXX() के बजाय attribXXX() फ़ंक्शंस का उपयोग अपने निरंतर मान निर्दिष्ट करने के लिए करें।

मुझे लगता है कि सबसे अच्छा उदाहरण हल्की स्थिति है। Normaly आपको इसके लिए वर्दी मान निर्दिष्ट करना होगा जब हर बार प्रकाश स्थिति सभी प्रोग्राम्स में इसका उपयोग करेगी। इसके विपरीत, 'जिम्मेदार' वर्दी का उपयोग करते समय आप विशेषता प्रकाश निर्दिष्ट कर सकते हैं जब एक बार globaly आपकी रोशनी चलता है।

-pros: यह विधि सबसे उपयुक्त है जब आपके पास कई प्रोग्राम हैं जो वर्दी साझा करना चाहते हैं, क्योंकि हम जानते हैं कि हम वेबजीएल में वर्दी बफर का उपयोग नहीं कर सकते हैं, यह एकमात्र उचित समाधान है।

-cons:

जैसे 'जिम्मेदार ठहराया की वर्दी के पाठ्यक्रम उपलब्ध आकार के

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

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