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

标签 android opengl-es-2.0 shader

问题 (TL;DR)

从根本上说,我的问题是我不知道 OpenGL ES 2.0 期望我如何编写和使用多个着色器;或者甚至建议/预期一个人会这样做。

这里的基本问题是:如果我有一个苹果、一 block 发光的石头和一个模糊的网格,都在同一个 3D 世界中,最好用不同的着色器程序绘制,但使用相同的 mvpMatrix,那么我将如何使用所有它们中的哪些在同一个 OpenGL 渲染中,以便它们都使用我编写的最合适的着色器?

我做了什么

所以我为我的 Android 游戏编写了一个基本的 OpenGL ES 2.0 程序,它可以完美地在屏幕上绘制对象的轮廓。但它什么也没做;几乎是因为着色器看起来像这样:

顶点着色器

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;

void main() {
    gl_Position = uMVPMatrix * aPosition;
}

fragment 着色器

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

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

我觉得这对于每天都在使用 OpenGL ES 2.0 的任何人来说都是基本知识,所以我希望有人能回答我的问题或为我指明正确的方向。

我有:

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

所以我希望我已经接近了解 OpenGL 工作流程,但我似乎还没有做到。

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

If your application is written for OpenGL ES 2.0, do not create a single shader with lots of switches and conditionals that performs every task your application needs to render the scene. Instead, compile multiple shader programs that each perform a specific, focused task.

来自 iOS OpenGL ES 2.0 guidelines.

最佳答案

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

关于android - OpenGL ES 2.0 多个程序或多个着色器还是什么?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209700/

相关文章:

c++ - 如何使用 glReadPixels 读取 float 据

java - 一个 Android 应用程序、一个启动 View 、两个图标

Android webview & localStorage

android - 将opencv添加到现有项目

LibGDX - 使用着色器将纹理覆盖在另一个纹理之上

android - Android NDK : Nothing being drawn 中的 OpenGL ES 2.0

Java android 从 imageView 和 TextView 获取一张位图

android - 在 android opengl es 2 上强制重绘以超过 60 fps

opengl - 使用 Cg 的 OpenGL 中的多个渲染目标

shader - 使用 SCN 技术的运动模糊