ฉันพยายามสร้างเอ็นจิ้นเกม 2D โดยใช้ OpenGL ES 2.0 (iOS สำหรับตอนนี้) ฉันได้เขียนเลเยอร์แอปพลิเคชันใน Objective C และแยกตัวเองบรรจุ RendererGLES20 ใน C ++ ไม่มีการโทรเฉพาะ GL นอกสายแสดงภาพ มันทำงานได้อย่างสมบูรณ์
แต่ฉันมีปัญหาการออกแบบเมื่อใช้ shaders Shader แต่ละตัวมีคุณสมบัติและเครื่องแบบที่เป็นเอกลักษณ์ของตัวเองซึ่งจำเป็นต้องตั้งค่าก่อนการเรียกสายหลัก (glDrawArrays ในกรณีนี้) ตัวอย่างเช่นในการวาดรูปทรงเรขาคณิตฉันจะทำ:
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 อื่นพูดเอฟเฟ็กต์ระลอกคลื่นฉันจะต้องผ่านชุดพิเศษจุดยอด attribs ฯลฯ กล่าวอีกนัยหนึ่งฉันต้องเปลี่ยน RendererGLES20 render source code เพื่อรวม shader ใหม่เข้าด้วยกัน
มีวิธีการทำวัตถุ shader ทั่วไปโดยสิ้นเชิง? เช่นถ้าฉันต้องการเปลี่ยนวัตถุ shader และไม่ต้องกังวลเกี่ยวกับการรวบรวมแหล่งเกมอีกครั้ง มีวิธีใดที่จะทำให้ตัวเรนเดอร์ไม่เชื่อเรื่องชุดเครื่องแบบและคุณสมบัติอื่น ๆ ? แม้ว่าเราจะต้องส่งข้อมูลไปยังชุดเครื่องแบบอะไรที่ดีที่สุดในการทำเช่นนั้น? คลาสโมเดล? คลาสโมเดลตระหนักถึงเครื่องแบบและคุณลักษณะเฉพาะของ shader หรือไม่?
ต่อไปนี้แสดงให้เห็นถึงระดับนักแสดง:
class Actor : public ISceneNode
{
ModelController * model;
AIController * AI;
};
โมเดลคอนโทรลเลอร์คลาส: คลาส ModelController {คลาส IShader * shader; รหัสพื้นผิว int; สี vec4; อัลฟาลอย; struct Vertex * vertexArray; };
คลาส Shader มีเพียงวัตถุ shader การรวบรวมและเชื่อมโยงรูทีนย่อยเป็นต้น
ในคลาส Game Logic จริง ๆ แล้วฉันแสดงวัตถุ:
void GameLogic::update(float dt)
{
IRenderer * renderer = g_application->GetRenderer();
Actor * a = GetActor(id);
renderer->render(a->model);
}
โปรดทราบว่าแม้ว่านักแสดงจะขยาย ISceneNode แต่ฉันยังไม่ได้เริ่มใช้ SceneGraph ฉันจะทำทันทีที่ฉันแก้ไขปัญหานี้
ความคิดใดที่จะปรับปรุงสิ่งนี้? รูปแบบการออกแบบที่เกี่ยวข้อง ฯลฯ ?
ขอบคุณที่อ่านคำถาม