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

问题(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的工作stream程,但我似乎还没有在那里。

编辑:我后来发现这个:

如果您的应用程序是为OpenGL ES 2.0编写的,请不要使用大量交换机和条件创build一个着色器,以执行应用程序呈现场景所需的每个任务。 相反,编译多个着色器程序,每个着色器程序执行一个特定的,重点任务

这是从iOS的OpenGL ES 2.0指导方针。

您可以使用多个着色器,但在它们之间切换可能会相当昂贵,所以build议的做法是绘制着色器的每个对象,然后切换到下一个着色器并使用该着色器绘制所有对象,依此类推。
要在着色器之间切换,请调用glUseProgram()