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

时间:2015-02-24 00:23:53

标签: java android opengl-es shader

我最近开始学习opengl,但仍然不太了解它。我正在按照教程编写这两个着色器:

顶点着色器:

#version 400

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

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

Fragment Shader:

#version 400

in vec4 color;
out vec4 fColor;

void main() {
    fColor = color;
}

他们使用OpenGL 3在桌面上编译和工作得很好,但是不能在Android上使用OpenGL ES 2进行编译。我尝试检查着色器输出日志,但它返回一个空字符串。再一次,我对此非常陌生,我的错误可能很简单,但任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:4)

在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,用于从片段着色器输出颜色。