为什么没有绑定 VAO 时 glValidateProgram 会失败?

Why does glValidateProgram fail when no VAO is bound?

我在 LWJGL/OpenGL 3 中验证我的着色器程序时遇到问题。
我阅读了文档,但似乎找不到调用 glValidateProgram 时需要 VAO 的原因。

int program = glCreateProgram();
int vertexShader = glCreateShader(...);
int fragmentShader = glCreateShader(...);
// ... vertex and fragment shader loading, compiling, errorchecking ...
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glBindAttribLocation(program, 0, "position");
glBindAttribLocation(program, 1, "color");
glLinkProgram(program);
glDetachShader(program, shader);
glDetachShader(program, shader);
glValidateProgram(program);
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE)
    System.exit(-1);

程序退出时没有任何错误消息。
GL_LINK_STATUS 正常,GL.getErrors() 也没有任何报告。
但是当围绕 glValidateProgram 创建一个 VAO 时,它工作得很好。
我也可以忽略 glGetProgrami returns GL_FALSE 和 运行 着色器程序这一事实。

围绕 glValidateProgram() 创建 VAO 的意思:

int vao = glGenVertexArrays();
glBindVertexArray(vao);
glValidateProgram(program);
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE)
    System.exit(-1);
glDeleteVertexArrays(vao);

当我这样做时,GL_VALIDATE_STATUS 是真的,我可以画我的东西了。

使用的着色器是简单的直通着色器。
顶点着色器 returns 位置和片段着色器 returns 颜色。

那么,为什么我必须绑定一个VAO,即使我可以在验证后立即删除它?

此行为符合 OpenGL 规范。我正在使用 OpenGL 3.3 规范作为参考。

在第 344 页的附录 E.2.2 "Removed Features" 中,它说:

The default vertex array object (the name zero) is also deprecated. Calling VertexAttribPointer when no buffer object or no vertex array object is bound will generate an INVALID_OPERATION error, as will calling any array drawing command when no vertex array object is bound.

第 82 页 glValidateProgram() 的规范说:

ValidateProgram will check for all the conditions that could lead to an INVALID_OPERATION error when rendering commands are issued, and may check for other conditions as well.

所以因为在没有 VAO 绑定的情况下发出绘图命令会给出 GL_INVALID_OPERATION 错误,而 glValidateProgram() 检查绘图命令是否会给出 GL_INVALID_OPERATION 错误,所以你所见即所得。