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

Rob*_*oli 55 shader android 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;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我有:

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

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

编辑:之后我发现这个很好:

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

这是来自iOS OpenGL ES 2.0指南.

Jav*_*ave 21

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

  • 后续问题:说我有两个程序,Foo和Bar.我替换每个人画一些东西.假设我调用glUseProgram(Foo),设置Foo的制服,纹理等,并绘制; 然后我调用glUseProgram(Bar),设置Bar的制服,纹理等,并绘制.下次我调用glUseProgram(Foo)时,GL状态(例如,活动/绑定纹理单元)会反映上次使用它时Foo的设置方式,还是我必须重置使用Bar时可能已更改的所有内容? (3认同)
  • 我只是想回来说这是我最终做到的确切方式.这非常有效,并且由于z-buffer,您无需以任何特定顺序绘制以在OpenGL中获得正确的深度. (2认同)