尽管顶点和片段着色器编译成功,着色器程序仍未链接。使用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 ++中具有相同的代码结构,并且可以完美地工作。
答案 0 :(得分:4)
gl.glGetProgramiv(id, GL4.GL_COMPILE_STATUS, success); // GL_FALSE
程序对象没有编译状态,只有着色器有。尝试在程序对象上查询GL_COMPILE_STATUS
只会导致产生一个GL_INVALID_ENUM
值,并且您的success
值的内容将不会以任何方式被修改。