मैं OpenGL ES 2.0 (अभी के लिए iOS) का उपयोग करके 2D गेम इंजन बनाने की कोशिश कर रहा हूं। मैंने ऑब्जेक्टिव C में एप्लिकेशन लेयर लिखी है और C ++ में एक अलग सेल्फ रेंडररजीएलईएस २० सम्मिलित है। रेंडर के बाहर कोई जीएल विशिष्ट कॉल नहीं किया जाता है। यह पूरी तरह से काम कर रहा है।
लेकिन मेरे पास शेड्स का उपयोग करते समय कुछ डिज़ाइन मुद्दे हैं। प्रत्येक शेडर की अपनी विशिष्ट विशेषताएँ और वर्दियाँ होती हैं जिन्हें मुख्य ड्रॉ कॉल (इस मामले में glDrawArays) से ठीक पहले सेट करने की आवश्यकता होती है। उदाहरण के लिए, कुछ ज्यामिति खींचने के लिए मैं करूँगा:
void RendererGLES20::render(Model * model)
{
// Set a bunch of uniforms
glUniformMatrix4fv(.......);
// Enable specific attributes, can be many
glEnableVertexAttribArray(......);
// Set a bunch of vertex attribute pointers:
glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords);
// Now actually Draw the geometry
glDrawArrays(GL_TRIANGLES, 0, m->vertexCount);
// After drawing, disable any vertex attributes:
glDisableVertexAttribArray(.......);
}
जैसा कि आप देख सकते हैं कि यह कोड बेहद कठोर है। अगर मुझे एक और shader का उपयोग करना है, तो रिपल इफेक्ट का कहना है, मुझे अतिरिक्त यूनीफॉर्म, वर्टेक्स एट्रीब आदि पास करने की जरूरत होगी। दूसरे शब्दों में मुझे नए जेंडर को शामिल करने के लिए RendererGLES20 रेंडर सोर्स कोड को बदलना होगा।
क्या शेडर ऑब्जेक्ट को पूरी तरह से सामान्य बनाने का कोई तरीका है? जैसे कि क्या होगा अगर मैं सिर्फ shader ऑब्जेक्ट को बदलना चाहता हूं और गेम सोर्स री-कंपाइलिंग के बारे में चिंता नहीं करता? वर्दी और विशेषताओं आदि के रेंडरर अज्ञेय को बनाने का कोई तरीका? भले ही हमें वर्दी को डेटा पास करने की आवश्यकता है, लेकिन ऐसा करने के लिए सबसे अच्छी जगह क्या है? मॉडल वर्ग? क्या मॉडल वर्ग को शेडर विशिष्ट वर्दी और विशेषताओं के बारे में पता है?
निम्नलिखित शो अभिनेता वर्ग:
class Actor : public ISceneNode
{
ModelController * model;
AIController * AI;
};
मॉडल नियंत्रक वर्ग: वर्ग मॉडलकंट्रोलर {वर्ग IShader * shader; int बुनावट; vec4 टिंट; फ्लोट अल्फा; संरचना वर्टेक्स * वर्टेकार्रे; };
शेडर क्लास में सिर्फ शैडर ऑब्जेक्ट, कंपाइलिंग और लिंकिंग सब-रूटिन आदि होते हैं।
गेम लॉजिक क्लास में मैं वास्तव में ऑब्जेक्ट को प्रस्तुत कर रहा हूं:
void GameLogic::update(float dt)
{
IRenderer * renderer = g_application->GetRenderer();
Actor * a = GetActor(id);
renderer->render(a->model);
}
कृपया ध्यान दें कि भले ही अभिनेता ISceneNode का विस्तार करता है, मैंने अभी तक SceneGraph को लागू करना शुरू नहीं किया है। मैं इस मुद्दे को हल करते ही करूंगा।
किसी भी विचार यह कैसे सुधारें? संबंधित डिजाइन पैटर्न आदि?
सवाल पढ़ने के लिए धन्यवाद।