एक इकाई / घटक प्रणाली में सामग्री को कैसे संभालना है


13

मेरा ई / सी कार्यान्वयन मूल है जहां एंटिटीज सिर्फ आईडी है, घटक डेटा हैं और सिस्टम डेटा पर कार्य करते हैं। अभी मुझे ऑब्जेक्ट मटीरियल और सामान्य रूप से रेंडर करने में परेशानी हो रही है। सरल ओब्जेक्ट्स के लिए, मेरे पास एक है ModelComponent, जो एक से बंधा है RenderSystem, ModelComponentमें वर्टेक्स बफर आईडी है जो रेंडर सिस्टम का उपयोग करता है। एक सरल MaterialComponentशायद रंग या स्पेक्युलर स्ट्रेंथ होगा, आदि, लेकिन मैं चाहता था कि यह एक से अधिक रेंडर पास और सामान्य "प्रभाव" के लिए अनुमति देने के लिए पर्याप्त लचीला हो जो एक साधारण चर के रूप में आसान नहीं है MaterialComponent

इन समस्याओं को हल करने के लिए मैं दो समाधानों के साथ आया:

1 - सुपर-जेनेरिक सामग्री घटक

कुछ इस तरह:

struct Material : public Component
{
    ShaderData* shader;
    std::vector<std::pair<std::string, boost::any>> uniforms;
    [...]
};

और रेंडर प्रणाली में मैं लूप में जाकर वर्दी को पास कर दूंगा। मुझे लगता है कि यह धीमा होगा, लेकिन मेरे उद्देश्यों के लिए पर्याप्त तेज़ होगा।

2 - अमूर्तता की एक और परत, मटेरियलडाटा

विशिष्ट सामग्रियों को लपेटने के लिए एक वर्ग होने से, जो कुछ भी विशेष सामग्री द्वारा विरासत में प्राप्त किया जा सकता है, आधार वर्ग में कुछ ऐसा होगा, void set_shader_constants(ShaderData* d)लेकिन कार्यान्वयन प्रत्येक वर्ग के लिए है, और MaterialComponentएक मैटेल्डाटा ऑब्जेक्ट के लिए एक संकेतक होगा।

मुझे यकीन नहीं है कि मैं किस दृष्टिकोण को पसंद करूंगा, लेकिन इनमें से कोई भी कई पास, या अन्य जटिल रेंडरिंग तकनीकों के विषय को नहीं छूता है।

यह कैसे पूरा करने पर कोई विचार?

जवाबों:


26

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

नतीजतन मैं सलाह दूंगा कि आप एक अलग तरीका अपनाएं:

  • एक सामग्री आपके रेंडर में सिर्फ एक अन्य प्रकार है।
  • आपके रेंडरर के पास एक प्रकार है जो "स्क्रीन पर खींची जाने वाली चीज़" का प्रतिनिधित्व करता है। अक्सर इन्हें "रेंडर इंस्टेंस" या "रेंडरटेबल" या "मॉडल" भी कहा जाता है। इस प्रकार में उस सामग्री का संदर्भ होता है जिसका उपयोग वह ड्राइंग के लिए करता है और रेंडर के उपभोक्ता को जो कुछ भी वांछित है उसे सेट करने के लिए सार्वजनिक एपीआई प्रदान करता है।

यह अनिवार्य रूप से आपको अपना ModelComponentनाम लेने और इसे फिर से नाम देने के लिए कह रहा है Model, इकाई / घटक परत पर निर्भरता को हटाते हुए और इस तरह इसे अपने बाकी रेंडरर के साथ, अमूर्त की निचली परत पर ले जाता है।

फिर, आप यह करते हैं:

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

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

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

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


1
आपके उत्तर के लिए धन्यवाद, यह समस्या मुझे काफी समय से परेशान कर रही थी, लेकिन E / C की बाधाओं के बिना रेंडर बनाना बहुत आसान है।
ल्यूक बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.