OpenGL ES 2.0 (şimdilik iOS) kullanarak bir 2D oyun motoru yapmaya çalışıyorum. Objective C Uygulama katmanı yazdım ve ayrı bir bağımsız RendererGLES20 C ++. Oluşturucunun dışında GL'ye özel bir çağrı yapılmaz. Mükemmel çalışıyor.
Ancak gölgelendiricileri kullanırken bazı tasarım sorunlarım var. Her gölgelendiricinin ana çizim çağrısından hemen önce ayarlanması gereken kendine özgü özellikleri ve üniformaları vardır (bu durumda glDrawArrays). Örneğin, bazı geometri çizmek için yapardım:
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(.......);
}
Gördüğünüz gibi bu kod son derece katı. Başka bir gölgelendirici kullanacak olsaydım, dalgalanma efekti, fazladan üniforma, köşe askısı vb. Geçirmem gerekiyordu.
Gölgelendirici nesnesini tamamen genel yapmanın bir yolu var mı? Like Sadece gölgelendirici nesnesini değiştirmek ve oyun kaynağının yeniden derlenmesinden endişe etmemek istersem ne olur? Oluşturucuyu üniforma ve nitelik vb. Agnostik hale getirmenin herhangi bir yolu var mı? Verileri üniformalara geçirmemiz gerekse de, bunu yapmak için en iyi yer hangisidir? Model sınıfı? Model sınıfı gölgelendiriciye özgü üniformaların ve özelliklerin farkında mı?
Aktör sınıfını aşağıda görebilirsiniz:
class Actor : public ISceneNode
{
ModelController * model;
AIController * AI;
};
Model denetleyici sınıfı: class ModelController {class IShader * shader; int textureId; vec4 tonu; float alfa; struct Vertex * vertexArray; };
Shader sınıfı yalnızca shader nesnesini içerir, alt rutinleri derler ve bağlar vb.
Game Logic sınıfında aslında nesneyi oluşturuyorum:
void GameLogic::update(float dt)
{
IRenderer * renderer = g_application->GetRenderer();
Actor * a = GetActor(id);
renderer->render(a->model);
}
Actor ISceneNode'u genişletmesine rağmen, henüz SceneGraph'ı uygulamaya başlamadığımı lütfen unutmayın. Bu sorunu çözer çözmez bunu yapacağım.
Bunu nasıl geliştireceğine dair bir fikrin var mı? İlgili tasarım desenleri vb?
Soruyu okuduğunuz için teşekkür ederim.