आस्थगित प्रतिपादन इंजन के लिए दृश्य ग्राफ


10

सीखने के अभ्यास के रूप में मैंने एक स्थगित प्रतिपादन इंजन लिखा है। अब मैं इस इंजन में एक दृश्य ग्राफ जोड़ना चाहता हूं, लेकिन मैं थोड़ा हैरान हूं कि यह कैसे करना है।

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

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

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

जवाबों:


6

C ++ प्रोजेक्ट में मैंने जो एप्रोच प्रयोग किया है, वह है कि दृश्य-ग्राफ (जिसमें स्थानिक सूचकांक है) एक 'दृश्यमान' std को भरता है :: वर्तमान दृश्य कुंठा के आधार पर हिट का वेक्टर। यह दृश्यमान सूची दृश्य-ग्राफ द्वारा प्रबंधित की जाती है, इसलिए केवल तब पुन: गणना की जाती है जब कैमरा चलता है - ग्राफ़ में चलती वस्तुओं को इस सूची में स्थानांतरित किया जाता है और कब्रों और बिना बदले हुए परिवर्तन-सूचियों का उपयोग करते हैं जो क्रमबद्ध हो जाते हैं और आवश्यकतानुसार वापस विलय हो जाते हैं।

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

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

फ्रंट-टू-बैक और अपारदर्शी-तब-पारदर्शी आरेखण सब कुछ शांत रखने में मदद करता है।

यह शायद shader परिवर्तन आदि की संख्या को कम नहीं कर रहा है, लेकिन यह लागू करने के लिए काफी व्यावहारिक और सीधा है।

मुझे इस बारे में कोई जानकारी नहीं है कि यह XNA के बारे में है और यह कैसे लागू होता है और आपके द्वारा बनाए गए निम्न स्तर के सामान से मुझे कितना डर ​​लगता है। हालांकि यह जानना सबसे दिलचस्प होगा कि C ++ RTSes के लिए दिग्गज इस दृष्टिकोण के बारे में क्या सोचते हैं।


हे विल, मुझे वास्तव में यह जवाब पसंद है, खासकर क्योंकि यह अब तक मैंने जो सोचा है, उससे पूरी तरह से अलग है। आपका तरीका बहुत समझदार लगता है, खासकर जब अर्ध-पारदर्शी वस्तुओं के बारे में भी सोचता है (जो कि मैंने अभी तक अभी तक बचा है)। वस्तुओं को देखने के लिए अपने दृश्य ग्राफ से लिंक (लिंक्ड) सूची बनाना एक बहुत अच्छा विचार लगता है। और हाँ XNA में हमें यह सब निम्न स्तर के सामान के लिए भी करना है :)।
रॉय टी।

3

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

दृश्य ग्राफ किसी भी प्रकार के रिश्तों पर आधारित हो सकता है, लेकिन मेरी व्यक्तिगत प्राथमिकता स्थानिक रिश्तों पर आधारित होगी, जहां प्रत्येक नोड में अन्य नोड्स शामिल हो सकते हैं ताकि तेजी से culling की सुविधा मिल सके।

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

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

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

क्योंकि आपकी डेटा संरचनाओं में तेज़ इंसर्ट है और कचरा उत्पन्न नहीं करता है, इसलिए सूची को फिर से खोलने के लिए कोई जुर्माना नहीं है जैसा कि आपने उल्लेख किया है।

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