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

时间:2016-09-29 04:32:29

标签: java opengl shader lwjgl vao

我在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返回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为真,我可以画出我的东西。

使用的着色器是简单的直通着色器。
顶点着色器返回位置,片段着色器返回颜色。

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

1 个答案:

答案 0 :(得分:5)

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

附录E.2.2"删除的功能"在第344页,它说:

  

也不推荐使用默认的顶点数组对象(名称为零)。在没有绑定缓冲区对象或没有绑定顶点数组对象时调用VertexAttribPointer将生成INVALID_OPERATION错误,在没有绑定顶点数组对象时调用任何数组绘制命令。

第82页的glValidateProgram()规范说:

  

ValidateProgram将检查在发出渲染命令时可能导致INVALID_OPERATION错误的所有条件,并且还可以检查其他条件。

因为发出没有VAO绑定的绘图命令会产生GL_INVALID_OPERATION错误,而glValidateProgram()检查绘图命令是否会产生GL_INVALID_OPERATION错误,那么你是什么看到完全符合预期。