कैसे एक बड़े इलाके जाल कुशलता से प्रस्तुत करना?


10

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

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

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

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

किसी भी तरह की गलती के लिए क्षमा करें, मैं इस क्षेत्र में बहुत नौसिखिया हूं।

जवाबों:


12

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

आपके डेटा के आधार पर, आप या तो अपने इलाक़े को पूरी ऊँचाई पर फैले प्लेन में खंभों में या अंतरिक्ष में क्यूब्स में विभाजित करना चाह सकते हैं। कोड पूर्ण नहीं है (fmod, वेक्टर आरंभीकरण, सूचकांक, ...) लेकिन आपको एक शुरुआत देनी चाहिए।

// Load vertices from disk
struct point { double x, y, z; };    
vector<point> vertices;

// Create container for chunks
typedef pair<int, int> key;
unordered_map<key, vector<point>> chunks;
const int chunksize = 10;

// For each vertex
for (int i = 0; i < vertices.size(); ++i) {
    // Fetch global coordinates
    int x = vertices[i].x,
        y = vertices[i].y,
        z = vertices[i].z;

    // Find containing chunk
    key k;
    k.first  = x / chunksize;
    k.second = z / chunksize;

    // Calculate local coordinates
    point p;
    p.x = x % chunksize;
    p.y = y;
    p.z = z % chunksize;

    // Add to chunk
    chunks[k].push_back(p);
}

// Create separate buffers for each chunk
// ...

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

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

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

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

  • बहुत कम रिज़ॉल्यूशन पर सीपीयू पर मेश को रेंडर करके ऑप्शन कल्लिंग किया जा सकता है। इससे आप अन्य लोगों के पीछे छिपी जालियों का जल्द पता लगा सकते हैं। उन्हें GPU पर भेजने की आवश्यकता नहीं है, इसलिए आप बहुत सारे शीर्ष shader निष्पादन को सहेजते हैं जो अन्यथा त्रिकोणों को अस्वीकार करने से पहले किया जाता था।

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

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