问题(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 的人来说都是基本知识,所以我希望有人能回答我的问题或为我指明正确的方向。
I have:
- 看了很多教程;除了最基本的着色器之外,它们都不使用任何东西。
- 阅读整个 OpenGL ES 2.0 GLSL 规范(其中没有提到它的用途;它只是关于所有内容的作用,而不是它们如何组合在一起)。
- 尝试稍微修改我的着色器。
所以我希望我已经接近了解 OpenGL 工作流程,但我似乎还没有做到这一点。
编辑:我后来发现这一点很好:
如果您的应用程序是为 OpenGL ES 2.0 编写的,请不要创建具有大量开关和条件的单个着色器来执行应用程序渲染场景所需的每项任务。相反,编译多个着色器程序,每个程序执行特定的、集中的任务。
那是来自iOS OpenGL ES 2.0 指南。 http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html#//apple_ref/doc/uid/TP40008793-CH105-SW11