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 中那样使用 in
和 out
变量前缀。相反,您使用以下关键字:
- 属性 每个顶点传递给顶点着色器的值
- 变化 从顶点着色器传递到片段着色器的值
- uniform 可以在着色器上为所有顶点和片段设置的全局变量(包括纹理之类的东西,但也可以是标量或向量类型)。
一个attribute
对应于顶点着色器中的一个in
。
varying
对应于顶点着色器中的 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
用于从片段着色器输出颜色。
最近才开始学习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 中那样使用 in
和 out
变量前缀。相反,您使用以下关键字:
- 属性 每个顶点传递给顶点着色器的值
- 变化 从顶点着色器传递到片段着色器的值
- uniform 可以在着色器上为所有顶点和片段设置的全局变量(包括纹理之类的东西,但也可以是标量或向量类型)。
一个attribute
对应于顶点着色器中的一个in
。
varying
对应于顶点着色器中的 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
用于从片段着色器输出颜色。