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