मेरा ई / सी कार्यान्वयन मूल है जहां एंटिटीज सिर्फ आईडी है, घटक डेटा हैं और सिस्टम डेटा पर कार्य करते हैं। अभी मुझे ऑब्जेक्ट मटीरियल और सामान्य रूप से रेंडर करने में परेशानी हो रही है। सरल ओब्जेक्ट्स के लिए, मेरे पास एक है 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
एक मैटेल्डाटा ऑब्जेक्ट के लिए एक संकेतक होगा।
मुझे यकीन नहीं है कि मैं किस दृष्टिकोण को पसंद करूंगा, लेकिन इनमें से कोई भी कई पास, या अन्य जटिल रेंडरिंग तकनीकों के विषय को नहीं छूता है।
यह कैसे पूरा करने पर कोई विचार?