我最近开始学习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;
}
它们可以在使用OpenGL 3的桌面上进行编译和正常工作,但不能在Android上使用OpenGL ES 2进行编译。我尝试检查着色器输出日志,但返回了空白字符串。同样,我对此很陌生,我的错误可能很简单,但是任何帮助将不胜感激。
最佳答案
在OpenGLES2中,您不会像在3.0中那样使用in
和out
变量前缀。而是使用以下关键字:
属性每个顶点传递到顶点着色器的值
从顶点着色器传递到片段着色器的各种值
统一的全局变量,可以在着色器上为所有顶点和片段设置(包括纹理之类的东西,但也可以是标量或矢量类型)。attribute
对应于顶点着色器中的in
。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
,用于从片段着色器输出颜色。关于java - OpenGL Shader可在台式机上编译,但不能在Android上编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28686185/