OpenGL Shader编译在桌面上,但不是Android
问题描述:
我最近开始学习opengl,但仍然不太了解它。我下面的教程,写了这两种着色器:OpenGL Shader编译在桌面上,但不是Android
顶点着色器:
#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
变量前缀。相反,您使用以下关键字:
- 属性被传递给每个顶点
- 顶点着色器不同的是从顶点着色器传递到片段着色器
- 均匀值价值观您可以在着色器上为所有顶点和片段设置全局变量(包括纹理等,但也可以是标量或矢量类型)。
attribute
对应于顶点着色器中的in
。 A 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
特别定义的变量用于从片段着色器输出的颜色。
+0
非常感谢!这工作!我的感谢无法用言语表达。现在我可以继续学习OpenGL了。 – 2015-02-24 01:47:39
不,那些着色器在GL3下将无法正常工作。如果他们这样做了,那么通过一个非常优秀的实现就是如此。那些着色器需要GL 4.0(尽管没有特别的原因,如果选择更合理的版本,他们可以使用3.x)。然而,在任何情况下,这些着色器都不适用于ES2,它使用不同的语法(与GLSL 1.20兼容),因此更改版本无济于事。 – derhass 2015-02-24 00:28:17
那么我能做些什么来使它工作? – 2015-02-24 00:30:00
没关系,samgak的答案有效。 – 2015-02-24 01:48:42