【问题标题】:Why does glValidateProgram fail when no VAO is bound?为什么没有绑定 VAO 时 glValidateProgram 会失败?
【发布时间】:2016-09-29 04:32:28
【问题描述】:

我在验证 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,即使我可以在验证后立即删除它?

【问题讨论】:

    标签: java opengl shader lwjgl vao


    【解决方案1】:

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

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

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

    第 82 页上 glValidateProgram() 的规范说:

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

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

    【讨论】:

    • 谢谢。由于在创建着色器期间程序绘制的对象是未知的,这意味着我没有要绑定的任何 vao,我不得不问,如果仅为着色器程序的验证过程创建 vao 是否是防止这种情况的有效方法错误,还是我对 vaos 和着色器之间的连接有任何误解,创建一个临时 vao 是暗示,我的渲染代码的结构有缺陷?
    • @iHaveNoIdeaWhatImDoing:据我了解,除了调试帮助之外,您不需要使用glValidateProgram。检查GL_LINK_STATUS 足以在编译时检查失败。
    • @iHaveNoIdeaWhatImDoing:glValidateProgram 的目的是检查使用给定程序所需的一切是否到位。这个名字有点倒霉,因为它并没有真正验证程序,而是执行环境(即OpenGL上下文的状态)符合程序的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多