问题(简而言之)
我的问题在于,我不知道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指南的建议。