我的问题,从根本上说,我不知道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工作流程,但我似乎还没有。
编辑:之后我发现了这个:
如果您的应用程序是为OpenGL ES 2.0编写的,请不要创建一个包含大量开关和条件的着色器,这些开关和条件执行应用程序渲染场景所需的每个任务。相反,编译多个着色器程序,每个程序执行特定的,重点突出的任务。
答案 0 :(得分:20)
您可以使用多个着色器,但要在它们之间切换可能会非常昂贵,因此建议的做法是绘制着色器的每个对象,然后切换到下一个着色器并使用该着色器绘制所有对象,依此类推。登记/>
要在着色器之间切换,请致电glUseProgram()
。