【问题标题】:is it more performant to write one complicated shader or several different shaders?编写一个复杂的着色器还是几个不同的着色器性能更好?
【发布时间】:2012-03-18 01:00:20
【问题描述】:

我刚刚学习 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++ 绘图循环中将不同的整数传递给 whichColor。或者,我可以只定义两个单独的着色器程序,其中一个将 gl_FragColor 设置为蓝色,另一个设置为绿色,当我需要在我的 OpenGL 场景中绘制特定对象时,只需加载一个或另一个。

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

【问题讨论】:

  • “更好”是一个主观问题。它无法回答,因此在 SO 上不欢迎询问哪个“更好”的问题。至少,给它一些标准。以何种方式“更好”?
  • “更好”是指“通常更快”或者“需要在系统和 gfx 卡内存之间传输最少的数据”或“更接近专业 OpenGL 开发人员实际所做的”。与编写一个非常复杂的着色器并不断通过制服向其传递数据的成本相比,在 glut 显示函数中多次加载新着色器的成本是多少?

标签: opengl glsl


【解决方案1】:

不久前我也在寻找有关此主题的答案。我从一些不同的游戏和书籍中收集到的是,您通常会使用不同的着色器。

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

void Draw(){

    glUseProgram(yourShaderProgram);

    glUniformX(yourUniformVariables);

    glDrawArrays(yourVAO);

}

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

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

【讨论】:

  • 除了答案之外,您至少可以使用#defines 将着色器源代码的组合爆炸控制在合理的范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多