क्या 24 क्यूबिक से कम घन का निर्माण संभव है


14

मेरे पास Minecraft की तरह एक घन-आधारित दुनिया है और मैं सोच रहा हूं कि क्या 24 क्यूबिक से कम क्यूब बनाने का कोई तरीका है ताकि मैं मेमोरी उपयोग को कम कर सकूं।

यह मेरे लिए 2 कारणों से संभव नहीं लगता: मानदंड सही नहीं निकलेंगे और प्रति-चेहरा बनावट काम नहीं करेगा।

क्या यह मामला है या मैं गलत हूं? शायद वहाँ कुछ फैंसी नई DX11 तकनीक है कि मदद कर सकता है?

संपादित करें: बस स्पष्ट करने के लिए, मेरे पास 2 आवश्यकताएं हैं: मुझे उचित प्रकाश व्यवस्था करने के लिए प्रत्येक घन चेहरे के लिए सतह मानदंडों की आवश्यकता है और मुझे प्रत्येक घन चेहरे के लिए एक बनावट सरणी में एक अलग सूचकांक को संबोधित करने का एक तरीका चाहिए।


1
क्या आप ग्राफिक्स कार्ड मेमोरी उपयोग या रैम उपयोग को कम करना चाहते हैं ?
डोपेलग्रेनर

1
वर्टेक्स डेटा अभी रैम में और GPU पर संग्रहीत है, इसलिए इसे कम करने से दोनों कम हो जाएंगे।
तेलनूर

जवाबों:


9

यदि आपको केवल प्रति-चेहरा मानदंडों की आवश्यकता है, और यदि आपके चेहरे के लिए टेक्सकोर्ड्स कड़ाई से 0/0, 0/1, 1/0, 1/1 (या आपके लेआउट के अनुरूप) हैं, तो आप 8 वाट्स के साथ एक क्यूब का निर्माण कर सकते हैं और या तो 30 (पुनरारंभ के साथ पट्टी) या 36 (सूची) अनुक्रमित। अपने वर्कशीट शेडर में SV_VertexID के आधार पर एक निरंतर सरणी लुकअप का उपयोग करके मानदंडों और टेक्सकोर्ड प्राप्त करें।

ऐसा करने का मतलब है कि आपको अपने शीर्ष बफ़र में टेक्सकोर्ड्स या मानदंडों को शामिल करने की आवश्यकता नहीं है, जो आपको मेमोरी सेविंग का और भी अधिक लाभ देगा।

आगे जाने पर, आप अभी भी 24 सेंट प्रति क्यूब तक जा सकते हैं, लेकिन इंस्टेंसेस का उपयोग भी कर सकते हैं। प्रत्येक क्यूब आपके वर्टेक्स बफर (1x1x1) में एक निश्चित आकार का होगा और आपके पास एक स्केलिंग फैक्टर और स्थिति होगी (यह मानते हुए कि आपके क्यूब्स घूमते नहीं हैं, एक मैट्रिक्स यदि वे करते हैं) प्रति-उदाहरण डेटा के रूप में। नॉन-रोटेटिंग केस में आपको एक बार 24 वर्ट की लागत आती है, लेकिन तब प्रत्येक क्यूब को पूरी तरह से निर्दिष्ट करने के लिए 6 फ्लोट की आवश्यकता होती है। घूर्णन मामले में आप 16 फ़्लोट्स को देख रहे हैं, लेकिन यहां तक ​​कि एक पर्याप्त बचत भी है (आप मैट्रिक्स पर अड़चन सीपीयू-साइड की अधिक संभावना रखते हैं इस मामले में - गैर-घूर्णन मामले के लिए मक्खी पर मैट्रिक्स का निर्माण करना आपका वर्टिकल शेडर - भले ही यह प्रति-वर्टेक्स किया गया हो, इतना मूर्खतापूर्ण तेज़ है कि आपको इसके बारे में चिंता करने की भी ज़रूरत नहीं है)।

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

आपको इसके साथ GS की आवश्यकता नहीं है, और इसे एक का उपयोग करने की तुलना में तेजी से चलाना चाहिए क्योंकि ज्यामिति shader चरण सक्षम होने से यह स्वयं का अतिरिक्त ओवरहेड लगाएगा।

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


1
मैं पहले इंस्टेंस का उपयोग कर रहा था और यह 40k क्यूब्स के तहत बहुत अच्छा काम करता है। लेकिन मेरे पास कम से कम 256k क्यूब्स हैं, और इंस्टेंस इसे संभाल नहीं रहा था। हालांकि देखने के साथ SV_VertexID का उपयोग करना बहुत ही आशाजनक लगता है।
तेलनूर

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

इसके अलावा - नक्शे की संख्या कम रखना आवश्यक है। नक्शा / एक क्यूब / अनमैप लिखें 40k बार नक्शा की तुलना में बहुत धीमा होने वाला है / 40k क्यूब्स / अनमैप बस एक बार लिखें। यदि आप पूर्व की कोशिश कर रहे थे तो बाद के लिए स्विच करना।
मैक्सिमस मिनिमस

15

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

सामान्य तौर पर, केवल उन चेहरों के लिए क्वैड उत्पन्न करते हैं जो हवा के संपर्क में हैं । इसका मतलब है कि यदि दो क्यूब्स एक-दूसरे को छू रहे हैं, तो आपको उस चेहरे के लिए कोई वर्टिकल उत्पन्न करने की आवश्यकता नहीं है जहां वे छू रहे हैं।

नीचे दी गई छवि इस अवधारणा को प्रदर्शित करती है, लेकिन आसान समझ के लिए 2 डी में। छवि में 11 कब्जे वाले ब्लॉक (भरे हुए ग्रे सर्कल द्वारा दर्शाए गए) हैं, जिन्हें सामान्य रूप से प्रतिनिधित्व करने के लिए 4 x 11 = 44 किनारों की आवश्यकता होगी (4 क्योंकि यह एक वर्ग है, घन नहीं)। लेकिन जैसा कि आप देख सकते हैं, आपको केवल किनारों को खींचने की ज़रूरत है जब वे एक खाली वर्ग के संपर्क में हों, जो इस मामले में केवल 8 किनारों पर है।

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

यदि 2 डी में ऐसा सरल उदाहरण 44 किनारों को 8 किनारों तक कम करने में कामयाब रहा, तो एक बड़े 3 डी दुनिया में लाभ की कल्पना करें ...

यह इस लेख में वर्णित दृष्टिकोण है , जिसे मैं आपको ओपनजीएल के उद्देश्य से पढ़ने के लिए सलाह देता हूं। अवधारणाओं को हालांकि बहुत सार्वभौमिक होना चाहिए।

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


1
बहुत ही रोचक लेख। मैं पहले से ही एज ऑप्टिमाइजेशन कर रहा हूं, जो निश्चित रूप से बहुत मदद करता है। मैं ज्योमेट्री शेड को एक कोशिश देता हूं और देखता हूं कि क्या काम करता है।
तेलनूर

क्या आपका मतलब है, मानदंड की गणना करने के लिए ज्यामिति शेडर और क्रॉस उत्पाद का उपयोग करें? मैं इसका उपयोग करने के बारे में सोच रहा था, जैसे कि सपाट सतहों के लिए एक अलग कार्यक्रम बनाएं (मैं बनावट से चिंतित नहीं हूं)।
२१:१२ पर द्रेता

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

यदि यह ऐसा प्रदर्शन है जो आप चाहते हैं, तो एक ज्यामिति shader का उपयोग न करें ... लगभग कभी भी। उन्होंने पाइपलाइन को पूरी तरह से खराब कर दिया। यदि आप GPU पर जियोमेट्री उत्पन्न करना चाहते हैं, तो एक कंपाउंडर shader या openCL का उपयोग करें
रॉबर्ट फ्रेजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.