OpenGL 着色器在桌面上编译,但不是 Android

OpenGL Shader Compiles on Desktop, But Not Android

最近才开始学习opengl,还不是很了解。我按照教程编写了这两个着色器:

顶点着色器:

#version 400

in vec4 s_vPosition;
in vec4 s_vColor;
out vec4 color;

void main() {
    color = s_vColor;
    gl_Position = s_vPosition;
}

片段着色器:

#version 400

in vec4 color;
out vec4 fColor;

void main() {
    fColor = color;
}

它们在使用 OpenGL 3 的桌面上编译和工作得很好,但不能在 Android 上使用 OpenGL ES 2 编译。我尝试检查着色器输出日志,但它返回了一个空字符串。同样,我对此很陌生,我的错误可能很简单,但我们将不胜感激任何帮助。

在 OpenGLES2 中,您不像在 3.0 中那样使用 inout 变量前缀。相反,您使用以下关键字:

  • 属性 每个顶点传递给顶点着色器的值
  • 变化 从顶点着色器传递到片段着色器的值
  • uniform 可以在着色器上为所有顶点和片段设置的全局变量(包括纹理之类的东西,但也可以是标量或向量类型)。

一个attribute对应于顶点着色器中的一个invarying 对应于顶点着色器中的 out 和片段着色器中的 in。因此,将您的顶点着色器更改为:

attribute vec4 s_vPosition;
attribute vec4 s_vColor;
varying vec4 color;

void main() {
    color = s_vColor;
    gl_Position = s_vPosition;
}

和你的片段着色器:

varying vec4 color;

void main() {
    gl_FragColor = color;
}

gl_FragColor 是一个特殊定义的变量,如 gl_Position 用于从片段着色器输出颜色。