OpenGL ES 2.0 (현재 iOS)을 사용하여 2D 게임 엔진을 만들려고합니다. Objective C로 Application 레이어를 작성하고 C ++로 별도의 자체 포함 RendererGLES20을 작성했습니다. GL 전용 호출은 렌더러 외부에서 이루어지지 않습니다. 완벽하게 작동합니다.
그러나 셰이더를 사용할 때 디자인 문제가 있습니다. 각 셰이더에는 고유 한 속성과 유니폼이 있으며, 이는 기본 그리기 호출 직전에 설정해야합니다 (이 경우 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(.......);
}
보시다시피이 코드는 매우 엄격합니다. 리플 효과와 같은 다른 셰이더를 사용하려면 여분의 유니폼, 정점 속성 등을 전달해야합니다. 즉, 새 셰이더를 통합하기 위해 RendererGLES20 렌더 소스 코드를 변경해야합니다.
셰이더 객체를 완전히 일반화하는 방법이 있습니까? 셰이더 오브젝트 만 변경하고 게임 소스 재 컴파일에 대해 걱정하지 않으려면 어떻게해야합니까? 렌더러가 유니폼과 속성 등을 무시하도록 만드는 방법은 무엇입니까? 데이터를 유니폼으로 전달해야하는데 가장 좋은 곳은 무엇입니까? 모델 수업? 모델 클래스가 쉐이더 특정 유니폼 및 속성을 알고 있습니까?
다음은 액터 클래스를 보여줍니다.
class Actor : public ISceneNode
{
ModelController * model;
AIController * AI;
};
모델 컨트롤러 클래스 : class ModelController {class IShader * shader; int textureId; vec4 색조; 플로트 알파; 구조체 정점 * vertexArray; };
셰이더 클래스에는 셰이더 객체, 서브 루틴 컴파일 및 링크 등이 포함됩니다.
Game Logic 클래스에서 실제로 객체를 렌더링하고 있습니다.
void GameLogic::update(float dt)
{
IRenderer * renderer = g_application->GetRenderer();
Actor * a = GetActor(id);
renderer->render(a->model);
}
액터가 ISceneNode를 확장하더라도 SceneGraph 구현을 아직 시작하지 않았습니다. 이 문제를 해결하자마자 그렇게하겠습니다.
이 아이디어를 개선하는 방법이 있습니까? 관련 디자인 패턴 등?
질문을 읽어 주셔서 감사합니다.