एक आस्थगित शेडिंग रेंडरर में ज्यामिति पास के लिए आम प्रतिपादन अनुकूलन तकनीकें क्या हैं? [बन्द है]


16

मैं OpenGL 3 और C ++ का उपयोग कर एक गेम इंजन विकसित कर रहा हूं (और विंडो प्रबंधन के लिए glfw)। मैंने अब तक उन्नत किया है, ध्वनि संस्थाओं और अनुकूलन को छोड़कर अधिकांश चीजें प्राप्त की हैं। इंजन आस्थगित शेडिंग का उपयोग करता है, क्योंकि आस्थगित छायांकन स्वयं एक औसत GPU के लिए एक थका देने वाली प्रक्रिया है, मैं यथासंभव प्रतिपादन प्रक्रिया का अनुकूलन करना चाहता हूं।

वर्तमान प्रणाली में एक दृश्य होता है, जिसमें एक रेंडरर होता है और वर्तमान विश्व और विश्व अलग-अलग संस्थाओं और प्रकाश व्यवस्थाओं को रखता है std::vectors

इसलिए मूल रूप से हर बार जब सीन बुलाया जाता है ->render(), और यह रेंडरर को कॉल करता है, दुनिया को एक पैरामीटर के रूप में पास करता है और दुनिया से इकाई पुनरावृत्तियों को प्राप्त करता है, उन्हें एफबीओ तक खींचता है और फिर दूसरे पास के लिए प्रकाश संस्थाओं के माध्यम से जाता है। और मुझे लगता है कि यह पर्याप्त नहीं है।

मेरा वर्तमान एल्गोरिथ्म सब कुछ के माध्यम से पुनरावृत्ति करता है, भले ही इकाई स्क्रीन स्पेस में न हो। मैं वर्तमान रेंडरिंग एल्गोरिथम को अनुकूलित करने के तरीके के बारे में सोच रहा हूं ताकि यह केवल दिखाई देने वाली वस्तुओं के लिए एपीआई फ़ंक्शन को कॉल करे, इसलिए ऐसे रेंडर को अनुकूलित करने के लिए सामान्य तकनीकें क्या हैं?

जवाबों:


41

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

अनुकूलन प्रदान करने के लिए कोई वास्तविक मानक नहीं हैं, बल्कि कई तकनीकों का उपयोग किया जा सकता है जो परस्पर क्रियात्मक विशेषताओं को प्राप्त करने के लिए परस्पर विनिमय या एक साथ उपयोग कर सकते हैं। प्रत्येक तकनीक का उपयोग करना दृश्य की प्रकृति पर निर्भर करता है।

आस्थगित प्रतिपादन रोशनी की संख्या बढ़ने पर समस्या को हल करने की कोशिश करता है, जो आगे के प्रतिपादन में पास की संख्या में विस्फोट कर सकता है।

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

एक फॉरवर्ड रेंडरर के मामले में, N शीर्ष की कुल संख्या के रूप में vertex count*lights countऔर उसके द्वारा खंड चरण के रूप में N शीर्ष को संसाधित किया जाएगा fragments count*number Lights, आस्थगित छायांकन प्रभावी रूप से केवल vertex countशीर्ष चरण के fragments countलिए और खंड की गिनती के लिए, इसे हल करने से पहले कम कर देता है वास्तविक छायांकन। लेकिन फिर भी एन को संसाधित करने के लिए बहुत अधिक हो सकता है, खासकर जब उनमें से अधिकांश को तुच्छ रूप से कुल्ला किया जा सकता है।

यह फॉरवर्ड रेंडरिंग / मल्टीपल पास के मामले में अधिक प्रभावी बनाता है। लेकिन ध्यान रखें कि अधिकांश इंजन दोहरी प्रतिपादन दृष्टिकोण का उपयोग करेंगे, क्योंकि अकेले स्थगित छायांकन पारदर्शी वस्तुओं को हल नहीं कर सकता है , इससे उन अनुकूलन का उपयोग करना आवश्यक है, मुझे किसी भी व्यावसायिक इंजन का पता नहीं है जो उन सभी को नहीं करता है।

फ्रस्ट्रम कलिंग

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

यहाँ छवि विवरण दर्ज करें

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

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

बाउंडिंग वॉल्यूम पदानुक्रम

पीछे की ओर मुंह करना

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

शामिल होना

जेड-बफर का उपयोग करके आप दृश्यता निर्धारण को हल कर सकते हैं। लेकिन समस्या यह है कि Z- बफर हमेशा प्रदर्शन के मामले में महान नहीं होता है, क्योंकि Z- बफर को केवल पाइप लाइन के बाद के चरणों में हल किया जा सकता है, जिन वस्तुओं को रखा जा रहा है, उन्हें rasterized किया जाना चाहिए और Z- बफर और को लिखा जा सकता है Z परीक्षण में विफल होने से पहले रंग बफर।

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

यहाँ छवि विवरण दर्ज करें

इस तरह की तकनीक का एक बड़ा वास्तविक उदाहरण GTA5 में है, जहां गगनचुंबी इमारतों को शहर के केंद्र में रखा गया है, न केवल सजावट है, बल्कि वे शहर के बाकी हिस्से को प्रभावी ढंग से बंद करने और इसे होने से रोकने के लिए भी काम करते हैं। rasterized।

LOD

विस्तार का स्तर

विस्तार का स्तर व्यापक रूप से उपयोग की जाने वाली तकनीक है, यह विचार जाल के एक सरल संस्करण का उपयोग करना है जब जाल दृश्य में कम योगदान दे रहा है। दो सामान्य कार्यान्वयन हैं; एक बस एक सरल के साथ जाल स्विच करता है जब यह अब बहुत योगदान नहीं दे रहा है, तो मेष को कुछ कारक के आधार पर चुना जाता है जैसे कि दूरी और पिक्सल (स्केयर पर क्षेत्र) की संख्या पर कब्जा कर रहा है। अन्य संस्करण गतिशील रूप से मेष को tessellates, यह व्यापक रूप से इलाके प्रतिपादन में उपयोग किया जाता है।

यहाँ छवि विवरण दर्ज करें

अगर इन सभी ने काम नहीं किया तो क्या होगा?

खैर, यह एक अच्छा सवाल है।

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

उसके बाद आपको टोंटी पर कुछ अनुकूलन करने की आवश्यकता है, ध्यान रखें कि इसके लिए कोई सही उत्तर नहीं है, और हार्डवेयर से दूसरे में भिन्न होगा।

कुछ सामान्य GPU अनुकूलन ट्रिक्स:

  • शेड्स में ब्रंच करने से बचें।
  • उदाहरण के {VNT}लिए एक ही सरणी में या {V},{N},{T}अलग-अलग सरणियों में विभिन्न शीर्ष संरचनाओं की कोशिश करें ।
  • आगे से पीछे की ओर आकर्षित दृश्य।
  • यदि उदाहरण के लिए Z परीक्षण की आवश्यकता नहीं है, तो उदाहरण के लिए कुछ बिंदुओं पर Z- बफर को बंद करें।
  • संपीड़ित बनावट का उपयोग करें।

कुछ सामान्य CPU अनुकूलन ट्रिक्स:

  • छोटे कार्यों के लिए इनलाइन फ़ंक्शन का उपयोग करें।
  • जब संभव हो तो SIMD (एकल निर्देश एकाधिक डेटा) का उपयोग करें।
  • कैश अनफ्रेंडली मेमोरी जंप से बचें।
  • डेटा के "सही" राशि के साथ VBOs का उपयोग करें। (आपके हार्डवेयर पर निर्भर करता है) लेकिन आमतौर पर कम ड्रॉ कॉल बेहतर होते हैं।

लेकिन क्या होगा अगर मेरी अड़चन स्थगित छायांकन में थी?

इस मामले में, चूंकि स्थगित छायांकन रोशनी के बारे में अधिक चिंतित है, तो सबसे स्पष्ट हिस्सा वास्तविक छायांकन गणना का अनुकूलन करना है। कुछ बिंदुओं पर नजर रखने के लिए:

  • रेंडर लाइट्स जो वास्तव में अंतिम छवि को प्रभावित करती हैं। दूसरे शब्दों में रोशनी का योगदान नहीं है। इसे प्रभावी ढंग से लागू किया जा सकता है जिसका उपयोग मैं पहले उल्लेख किए गए रोड़ा के उपयोग से कर सकता हूं।
  • क्या इस प्रकाश को स्पेक्युलर या कुछ अन्य घटकों की आवश्यकता है? शायद नहीं।
  • क्या यह प्रकाश डाली छाया है? कुछ रोशनी छाया डालने की जरूरत नहीं है।
  • क्या इस हल्के योगदान की गणना पहले की जा सकती है? यदि यह नहीं चल रहा है तो शायद कुछ पहलुओं की गणना पूर्व की जा सकती है।

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

@ मिक्लीह दुर्भाग्य से, जाहिर तौर पर आपने सवाल नहीं पढ़ा, उनकी समस्या मुख्य रूप से यह थी कि वह हर बार पूरे दृश्य पर ध्यान केंद्रित करते थे, और उन्होंने किसी भी अड़चन का उल्लेख नहीं किया। मैंने पहली बार उल्लेख किया है कि बहुत अधिक रोशनी / सामग्री होने पर फटे हुए शेडिंग पास विस्फोट की समस्या को हल करता है। लेकिन फिर मैंने कहा कि वे किसी भी इंजन के लिए अनुकूलन करना चाहिए चाहे वह छायांकन तकनीक को आगे बढ़ाए या कम किया गया हो। इस बारे में कि ये सटीक मुद्दे हैं कि तकनीक मुझे बहुत प्रभावित करती है, मैं पूरे अंक यहाँ नहीं दे सकता (निम्नानुसार है)
concept3d

उदाहरण के लिए बिना कुंठित इंजन के एक आस्थगित इंजन का निर्माण करना वास्तव में बेवकूफी है, इसलिए इंजन उदाहरण के लिए प्रक्रिया करेगा (100 मिलियन वर्टेक्स) बस जी-बफर को परिणाम प्रस्तुत करने में सक्षम होने के लिए। अलग-अलग छायांकन एक अलग समस्या का हल करता है, जो कि उसकी समस्या नहीं थी, उसकी समस्या सभी ज्यामिति को पाइपलाइन में जमा कर रही थी।
concept3d

हालांकि मैं इस बात पर सहमत हूं कि प्रकाश गणना पर कुछ अनुकूलन होना चाहिए, और यदि प्रकाश गणना प्रमुख नहीं थी, तो स्थगित करना गलत तरीका है। लेकिन फिर से वह उसकी समस्या नहीं थी।
concept3d

यदि आप यह स्पष्ट करते हैं कि ये अनुकूलन एक आस्थगित रेंडर के लिए कम से कम प्रभावी हैं, तो मैं अपने डाउनवोट को वापस ले लूंगा, क्योंकि यह खड़ा है कि आपने उसे / उसके गुगलों को नहीं दिखाया है कि प्रदर्शन समस्या का आस्थगित छायांकन से कोई लेना- देना नहीं है।
मिकेल

6

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

जब आपने अवधारणा 3 डी के साथ समाप्त कर लिया है, तो यदि आप वास्तव में पाते हैं कि आपको आस्थगित शेडर को स्वयं को अनुकूलित करने की आवश्यकता है (जैसा कि पूरे रैस्टराइजेशन पास के विपरीत है) तो आप टाइल-आधारित डिफर्ड शेडिंग को लागू कर सकते हैं।

यदि आप डायनामिक लाइटों की संख्या से सीमित नहीं हैं, तो आपको विचार करना चाहिए कि आप क्यों आस्थगित छायांकन का उपयोग कर रहे हैं, लेकिन यदि आप हैं तो आप उस अनुकूलन को आज़माना चाहेंगे जो बैटलफ़ील्ड 3 को संभव बनाता है। (वे अपनी सार्वजनिक पीडीएफ की स्लाइड 10 में इसका संकेत देते हैं: http://dice.se/wp-content/uploads/GDC11_DX11inBF3_Public.pdf )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.