2013-12-08 2 views
0

우선, 프로젝션 뷰 매트릭스를 얻기 위해 GetViewProj()라는 메서드로 카메라 개체를 가지고 있습니다.OpenGL에서 모델 당 단일 셰이더

또한 셰이더 컴파일 및 연결 및 유니폼 및 특성 설정을 처리하기 위해 shaderprogram 개체를 만들었습니다. 각 모델에는 특정 셰이더를 처리하기위한이 셰이더 프로그램의 인스턴스가 있습니다.

내가 좋아하는 장면을 렌더링 할 수있을 수 있도록하고 싶습니다 다음

void RenderScene(){ 

    ModelA->Render(); 
    ModelB->Render(); 
} 

는 내가 알고 싶은 것은 제대로이 models.Do I에 뷰 및 프로젝션에 넥타이를하는 방법 단지

ModelA->shaderprogram->setUniform("viewProj",Camera->GetViewProj()); 
ModelB->shaderprogram->setUniform("viewProj",Camera->GetViewProj()); 

나는 또한이 설정에 관해서 일반적으로 더 나은 방법이 있는지 알고 싶습니다하여 RenderScene 기능의 각 모델에 대해 다음을 수행합니다.

답변

0

주어진 모델의 Render 함수를 해석하면 렌더링 장면 호출의 시작 부분에 뷰 투영을 설정하는 것이 아니라 렌더링을 수행하는 데 필요한 모든 작업을 담당해야한다는 것입니다 (btw는 모두 귀하의 모델 중 세계 공간에 정의해야합니다.), 나는 그것을 Render 함수의 책임을 져야하고 현재 modelview 매트릭스를 얻을 것이다.

내 응용 프로그램에는 인스턴스를 가져 오는 정적 액세스 방법이있는 Stacks 싱글 톤 유형이 있습니다. 셰이더를 모델 자체에 바인딩하지 않기 때문에 메쉬 및 셰이더 프로그램을 모두 허용하는 렌더링 도우미 메서드를 사용합니다.

void GlUtils::renderGeometry(
    const GeometryPtr & geometry, 
    ShaderResource vs, 
    ShaderResource fs) 
{ 
    ProgramPtr program = GlUtils::getProgram(vs, fs); 
    program->use(); 
    // apply lighting model uniforms 
    Stacks::lights().apply(program); 
    // apply the current projection matrix 
    Stacks::projection().apply(program); 
    // apply the modelview matrix 
    Stacks::modelview().apply(program); 
    // This compares the list of uniforms in the program with what I've bound. 
    // If I haven't configured some it will warn me. 
    program->checkConfigured(); 

    // draw the actual model 
    geometry->bindVertexArray(); 
    geometry->draw(); 

    // restore the OpenGL state 
    VertexArray::unbind(); 
    Program::clear(); 
} 

귀하의 모델 Render 방법은 유사 싱글에게 도달하고 renderScene 수준에서 관리를 담당하지 않은 있도록 적절한 매트릭스를 가져올 수 있습니다.

관련 문제