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

iHa*_*ing 5 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);
Run Code Online (Sandbox Code Playgroud)

这将退出程序,而不会出现任何错误消息。
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);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,GL_VALIDATE_STATUS为true,我可以画画了。

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

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

Ret*_*adi 7

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

在第344页的附录E.2.2“已删除的功能”中,它表示:

默认的顶点数组对象(名称为零)也已弃用。没有绑定缓冲区对象或没有顶点数组对象时调用VertexAttribPointer会产生INVALID_OPERATION错误,就像没有绑定顶点数组对象时调用任何数组绘制命令一样。

glValidateProgram()第82页的规格说:

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

因此,因为发出没有VAO限制的绘图命令会给出GL_INVALID_OPERATION错误,并glValidateProgram()检查绘图命令是否会GL_INVALID_OPERATION出错,所以您所看到的与预期的完全一样。

  • @iHaveNoIdeaWhatImDoing:据我了解,除调试辅助工具外,您无需使用“ glValidateProgram”。检查“ GL_LINK_STATUS”足以在编译时检查失败。 (3认同)