java - 为什么没有绑定(bind) VAO 时 glValidateProgram 会失败?

标签 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 为真,我可以绘制我的东西了。

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

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

最佳答案

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

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

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 绑定(bind)的情况下发出绘图命令将给出 GL_INVALID_OPERATION 错误,而 glValidateProgram() 检查绘图命令是否会给出 GL_INVALID_OPERATION 错误,您所看到的与预期的完全一样。

关于java - 为什么没有绑定(bind) VAO 时 glValidateProgram 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39761456/

相关文章:

opengl - DirectX/OpenGL 中的三角形绘制顺序

math - 使用 Eigen 计算 2D 相机的模型 View 矩阵

javascript - 从片段着色器恢复像素数据会导致意外行为

Java SWT - 禁用按钮上的图像

Java 以一种干净的方式动态地在多个按钮上使用事件处理程序

java - CouchBase 与 Memcached 混合,失去了大多数 CouchDB 理念和功能?

java - 为 JAXB.unmarshal() 提取 XML 节点的最简单方法是什么?

opengl - glVertexAttribDivisor和索引输入

opengl-es - 在 OpenGL 中使用着色器向位图字体添加渐变

c - 如何对纹理执行 HSL 变换?