OpenGL ES 2.0: Shader链接失败

OpenGL ES 2.0: Shader Linking Fail

本文关键字:Shader 链接 失败 ES OpenGL      更新时间:2023-10-16

我正在尝试制作一个使用openGL的简单android程序。到目前为止,着色器链接失败,日志信息是,

日志

Link info
    ---------
    OpenGL ES programs must have both a vertex and a fragment shader or a compute shader.  

着色器编译工作良好。下面是着色器代码:

顶点着色器

attribute vec4 a_Position;
void main() {
    gl_Position = a_Position;
    gl_PointSize = 10.0;
}  

片段着色器

uniform vec4 u_Color;
void main()
{
    gl_FragColor = u_Color;
}  

我正在采取的步骤是,

final int programObjectId = glCreateProgram();
if(programObjectId == 0)
   return 0;
glAttachShader(programObjectId, vertexShaderId);
glAttachShader(programObjectId, fragmentShaderId);
glLinkProgram(programObjectId);

编译代码

public static int compileShader(int type, String code) {
    final int shaderObjectId = glCreateShader(type);
    glShaderSource(shaderObjectId, code);
    glCompileShader(shaderObjectId);
    int compilationStatus[] = new int[1];
    glGetShaderiv(shaderObjectId, GL_COMPILE_STATUS, compilationStatus, 0);
    if(compilationStatus[0] == 0)
        glDeleteShader(shaderObjectId);
    return shaderObjectId & compilationStatus[0];
}

我不知道如何解决这个问题。

问题在于compileShader的最后一行:这里您对shaderObjectId(任意数字> 0)和compilationStatus (GL_TRUE或GL_FALSE)执行位和操作。由于GL_TRUE = 1, GL_FALSE = 0,因此该操作的结果只能是0或1。

让我们看看GL_TRUE的情况,因为GL_FALSE的结果无论如何都是0。

For every even number x:
x & 1 == 1
For every odd number x:
x & 1 == 0

这意味着,如果shaderObjectId = 3(例如),该函数将返回1。