【发布时间】: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