为什么尽管链接和验证成功,着色器程序仍无法编译?

时间:2018-11-25 17:04:46

标签: java opengl glsl shader jogl

尽管顶点和片段着色器编译成功,着色器程序仍未链接。使用glGetProgramInfoLog()不会检索任何错误消息。但是,GL_FALSE的值会在success缓冲区变量中检索(抛出GLException并带有空消息)。这是代码:

private int compileProgram(String[] vertexShaderSource, String[] fragmentShaderSource) 
        throws GLException {
    // compiling vertex and fragment shaders from source

    int vertexShader = compileShader(GL4.GL_VERTEX_SHADER, vertexShaderSource); // OK
    int fragmentShader = compileShader(GL4.GL_FRAGMENT_SHADER, fragmentShaderSource); // OK
    int id = gl.glCreateProgram(); // OK

    // attaching the shaders to the shader program and linking it

    gl.glAttachShader(id, vertexShader);
    gl.glAttachShader(id, fragmentShader);
    gl.glLinkProgram(id);
    gl.glDeleteShader(vertexShader);
    gl.glDeleteShader(fragmentShader);

    IntBuffer success = IntBuffer.allocate(1);

    gl.glGetProgramiv(id, GL4.GL_COMPILE_STATUS, success);    // GL_FALSE

    // checking for errors

    if (success.get(0) == GL4.GL_FALSE) {
        IntBuffer infoLogLength = IntBuffer.allocate(1);

        gl.glGetProgramiv(id, GL4.GL_INFO_LOG_LENGTH, infoLogLength);

        ByteBuffer infoLog = ByteBuffer.allocate(infoLogLength.get(0));

        gl.glGetProgramInfoLog(id, infoLogLength.get(0), infoLogLength, infoLog);

        // Empty error message           

        String errorMessage = new String(infoLog.array(), Charset.forName("UTF-8"));

        throw new GLException(errorMessage);
    }

     return id;
}

这是包含两个着色器的文件的link(在程序中,每个着色器实际上都包含在其自己的String[]变量中)。

附言::我在C ++中具有相同的代码结构,并且可以完美地工作。

1 个答案:

答案 0 :(得分:4)

gl.glGetProgramiv(id, GL4.GL_COMPILE_STATUS, success);    // GL_FALSE

程序对象没有编译状态,只有着色器有。尝试在程序对象上查询GL_COMPILE_STATUS只会导致产生一个GL_INVALID_ENUM值,并且您的success值的内容将不会以任何方式被修改。