Почему шейдерная программа не компилируется, несмотря на успешное связывание и проверку? - PullRequest
0 голосов
/ 25 ноября 2018

Шейдерная программа не связывается, несмотря на то, что вершинный и фрагментный шейдеры успешно компилируются.Сообщение об ошибке не возвращается с использованием 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;
}

Вот ссылка на файл, содержащий два шейдера (в программе каждый шейдер фактически содержится в собственной переменной String[]).

PS: У меня такая же структура кода в C ++, и она работает без нареканий.

1 Ответ

0 голосов
/ 25 ноября 2018
gl.glGetProgramiv(id, GL4.GL_COMPILE_STATUS, success);    // GL_FALSE

Программный объект не имеет статуса компиляции, только шейдеры.Попытка запроса GL_COMPILE_STATUS к программному объекту приведет только к значению GL_INVALID_ENUM, и содержимое вашего значения success не будет изменено никаким образом.

...