Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL着色器可在桌面上编译,但不能在Android上编译_Java_Android_Opengl Es_Shader - Fatal编程技术网

Java OpenGL着色器可在桌面上编译,但不能在Android上编译

Java OpenGL着色器可在桌面上编译,但不能在Android上编译,java,android,opengl-es,shader,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; } 片段着色器: #version 400 in vec4 color; out vec4 fColor; void main

我最近开始学习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;
}

它们使用OpenGL3在桌面上编译和工作正常,但不使用Android上的OpenGLES2进行编译。我尝试检查着色器输出日志,但它返回一个空白字符串。同样,我对这一点很陌生,我的错误可能很简单,但任何帮助都将不胜感激。

在OpenGLES2中,您不会像3.0中那样使用
In
out
变量前缀。而是使用以下关键字:

  • 属性每个顶点传入顶点着色器的值
  • 改变从顶点着色器传递到片段着色器的值
  • 统一全局变量,可在着色器上为所有顶点和片段设置(包括纹理等,但也可以是标量或向量类型)
属性
对应于顶点着色器中的
variable
对应于顶点着色器中的
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;
}
将片段着色器添加到以下内容:

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

在OpenGLES2中,您不会像3.0中那样使用
In
out
变量前缀。而是使用以下关键字:

  • 属性每个顶点传入顶点着色器的值
  • 改变从顶点着色器传递到片段着色器的值
  • 统一全局变量,可在着色器上为所有顶点和片段设置(包括纹理等,但也可以是标量或向量类型)
属性
对应于顶点着色器中的
variable
对应于顶点着色器中的
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;
}
将片段着色器添加到以下内容:

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

不,这些着色器无法与gl 3配合使用。如果他们这样做了,那就是通过基因实现。这些着色器需要GL 4.0(不过,没有特殊原因,如果选择了更合理的版本,它们可以使用3.x)。但是,这些着色器在任何情况下都不适用于ES2,因为ES2使用了不同的语法(与GLSL 1.20兼容),因此更改那里的版本不会有帮助。那么我该怎么做才能使其正常工作呢?不要紧,samgak的答案是行得通的。不,那些着色器在GL3中无法正常工作。如果他们这样做了,那就是通过基因实现。这些着色器需要GL 4.0(不过,没有特殊原因,如果选择了更合理的版本,它们可以使用3.x)。但是,这些着色器在任何情况下都不适用于ES2,因为ES2使用了不同的语法(与GLSL 1.20兼容),因此更改那里的版本没有任何帮助。那么我可以做些什么来让它工作呢?不要紧,samgak的答案很有效。非常感谢!这成功了!我的感激之情无法用语言表达。现在我可以继续学习openGL了。非常感谢!这成功了!我的感激之情无法用语言表达。现在我可以继续学习openGL了。