2013-12-08 36 views
0

首先,我有一个相机对象与一个名为GetViewProj()的方法来获取投影*视图矩阵。OpenGL中的每个模型的单个着色器

我还创建了一个shaderprogram对象,用于处理着色器的编译和链接以及设置制服和属性。 每个模型都有一个该着色器程序的实例来处理特定的着色器。

我希望能能够渲染场景如下所示:

void RenderScene(){ 

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

我想知道的是如何正确地绑在视图和投影到这些models.Do我只是就在RenderScene功能每种型号如下:

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

我也想知道是否有一般一个更好的方法,当谈到设置此功能。

回答

0

我对给定模型的Render函数的解释是,它应该负责执行渲染所需的所有操作,而不是在渲染场景调用的开始处设置视图投影(这意味着所有你的模型必须在世界空间中定义,这是不合情理的),我会承担Render函数的职责,以获取当前的模型视图矩阵。

在我的应用程序中,我有一个Stacks singleton类型,它有一个静态访问方法来获取实例。我不把自己的着色器绑定到模型本身,所以我使用一个接受网格和着色器程序的渲染辅助方法。

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级别管理它。