编写一个复杂的着色器或几个不同的着色器是否更高效?

时间:2012-03-18 01:00:21

标签: opengl glsl

我正在学习OpenGL,我意识到对于更复杂的着色器效果,基本上有两种可以用来实现它们的状态。第一种是编写一个复杂的顶点和片段着色器,它接受来自主程序的许多不同的统一变量,并决定在着色器中做什么。防爆。如果我想在一个上下文中生成像素蓝色而在另一个上下文中生成绿色,我可能会在GLSL中执行:

uniform int whichColor;
int main() {
    if (whichColor == 1) {
        gl_FragColor = vec4(0,1.0,0,1.0);
    }
    else {
          gl_FragColor = vec4(0,0,1.0,1.0);
    }
 }

并在我的C ++绘图循环中向其中传递不同的颜色。或者,我可以定义两个单独的着色器程序,其中一个将gl_FragColor设置为蓝色,另一个设置为绿色,只需加载一个或另一个,当我需要在我的OpenGL场景中绘制特定对象时。

但是,我似乎无法找到有关这些策略中哪一种更好的信息。我可能期望第一个策略,将所有渲染在显卡上的复杂性,更高效,但在各种情况下,我正在考虑决定绘制的内容不是每像素计算而且不是从并行化中受益。我真的不明白着色器程序如何在显卡上运行以及链接和传递变量的成本是多少,所以我不确定我的直觉在这里是否正确。

1 个答案:

答案 0 :(得分:2)

我前段时间也在寻找这个话题的答案。我从几个不同的游戏和书籍中收集到的是你通常使用不同的着色器。

您可以编译所有需要的着色器程序,并将每个要绘制的对象切换到所需的着色器程序:

void Draw(){

    glUseProgram(yourShaderProgram);

    glUniformX(yourUniformVariables);

    glDrawArrays(yourVAO);

}

您不想做的是每次需要时加载和链接着色器程序。

相反,在某处保留所有着色器程序的列表,或将程序的id传递给每个对象,以便他们可以使用它。