我最近开始学习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中那样使用inout变量前缀。而是使用以下关键字:


属性每个顶点传递到顶点着色器的值
从顶点着色器传递到片段着色器的各种值
统一的全局变量,可以在着色器上为所有顶点和片段设置(包括纹理之类的东西,但也可以是标量或矢量类型)。


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/

10-17 03:12