2015-02-24 33 views
0

我最近开始学习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进行编译。我试着检查着色器输出日志,但它返回一个空白字符串。再一次,我对此很新,我的错误可能非常简单,但任何帮助都将受到高度赞赏。

+1

不,那些着色器在GL3下将无法正常工作。如果他们这样做了,那么通过一个非常优秀的实现就是如此。那些着色器需要GL 4.0(尽管没有特别的原因,如果选择更合理的版本,他们可以使用3.x)。然而,在任何情况下,这些着色器都不适用于ES2,它使用不同的语法(与GLSL 1.20兼容),因此更改版本无济于事。 – derhass 2015-02-24 00:28:17

+0

那么我能做些什么来使它工作? – 2015-02-24 00:30:00

+0

没关系,samgak的答案有效。 – 2015-02-24 01:48:42

回答

4

在OpenGLES2中,您不使用像3.0中那样的inout变量前缀。相反,您使用以下关键字:

  • 属性被传递给每个顶点
  • 顶点着色器不同的是从顶点着色器传递到片段着色器
  • 均匀价值观您可以在着色器上为所有顶点和片段设置全局变量(包括纹理等,但也可以是标量或矢量类型)。

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

相关问题