我在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,即使我可以在验证后立即删除它?
答案 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
错误,那么你是什么看到完全符合预期。