OpenGL ES 2.0多个程序或多个着色器还是什么?它是如何工作的?

时间:2012-02-09 11:03:57

标签: android opengl-es-2.0 shader

问题(TL; DR)

我的问题,从根本上说,我不知道OpenGL ES 2.0是如何期望我编写和使用多个着色器的;或者如果一个人愿意/预期会这样做。

这里的基本问题是:如果我有一个苹果,一块发光的岩石和一个模糊的网格,都在同一个3D世界中,最好使用不同的着色器程序绘制,但使用相同的mvpMatrix,那么我将如何使用所有它们在相同的OpenGL渲染中,以便它们都使用我编写的最合适的着色器?

我做了什么

所以我为我的Android游戏编写了一个基本的OpenGL ES 2.0程序,它可以完美地工作,因为它可以将对象的轮廓绘制到屏幕上。但它没有别的;几乎是因为着色器看起来像这样:

顶点着色器

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;

void main() {
    gl_Position = uMVPMatrix * aPosition;
}

片段着色器

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

现在它们非常基本。我没有走得更远的原因是因为我无法弄清楚我是否应该编写一个着色器来应用于我的所有不同对象,或者我是否应该使用多个着色器。如果我应该使用多个着色器绘制多个不同的对象,那么我该如何以有效的方式去做呢?

我觉得这对于每天都在使用OpenGL ES 2.0的人来说必须是基本的知识,所以我希望有人可以回答我的问题或指出我正确的方向。

我有:

  • 看了多个教程;除了最基本的着色器外,其中任何一个都不使用。
  • 阅读整个OpenGL ES 2.0 GLSL规范(其中没有一个提到过如何使用它;它只是关于所做的一切而不是它如何组合在一起)。
  • 尝试修改我的着色器。

所以我希望我接近理解OpenGL工作流程,但我似乎还没有。

编辑:之后我发现了这个:

  

如果您的应用程序是为OpenGL ES 2.0编写的,请不要创建一个包含大量开关和条件的着色器,这些开关和条件执行应用程序渲染场景所需的每个任务。相反,编译多个着色器程序,每个程序执行特定的,重点突出的任务。

来自iOS OpenGL ES 2.0 guidelines.

1 个答案:

答案 0 :(得分:20)

您可以使用多个着色器,但要在它们之间切换可能会非常昂贵,因此建议的做法是绘制着色器的每个对象,然后切换到下一个着色器并使用该着色器绘制所有对象,依此类推。登记/> 要在着色器之间切换,请致电glUseProgram()