Java OpenGL着色器可在桌面上编译,但不能在Android上编译
我最近开始学习opengl,但仍然不太了解它。我遵循教程编写了以下两个着色器: 顶点着色器: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
#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了。