Java 清除OpenGL着色器中的属性位置

Java 清除OpenGL着色器中的属性位置,java,opengl,shader,lwjgl,vao,Java,Opengl,Shader,Lwjgl,Vao,有没有一种方法可以覆盖或清除OpenGL中的属性位置? 例如(我使用的是lwjgl),我渲染如下内容: public void render(int vaoID, int vertexCount, int shaderProgramID){ GL30.glBindVertexArray(vaoID); GL20.glBindAttribLocation(shaderProgramID, 0, "position"); GL20.glBindAttribLocation(

有没有一种方法可以覆盖或清除OpenGL中的属性位置? 例如(我使用的是lwjgl),我渲染如下内容:

public void render(int vaoID, int vertexCount, int shaderProgramID){
    GL30.glBindVertexArray(vaoID);

    GL20.glBindAttribLocation(shaderProgramID, 0, "position");
    GL20.glBindAttribLocation(shaderProgramID, 1, "normal");

    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);

    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);

    GL20.glDisableVertexAttribArray(0);
    GL20.glDisableVertexAttribArray(1);

    GL30.glBindVertexArray(0);
}
然后我想用相同的shaderProgramID运行下一个代码

public void render(int vaoID, int vertexCount, int shaderProgramID){
    GL30.glBindVertexArray(vaoID);

    //this previously was position
    GL20.glBindAttribLocation(shaderProgramID, 0, "normal");
    //and this was the normal
    GL20.glBindAttribLocation(shaderProgramID, 1, "position");

    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);

    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);

    GL20.glDisableVertexAttribArray(0);
    GL20.glDisableVertexAttribArray(1);

    GL30.glBindVertexArray(0);
}
如您所见,我更改了以下代码:

GL20.glBindAttribLocation(shaderProgramID, 0, "position");
GL20.glBindAttribLocation(shaderProgramID, 1, "normal");
为此:

GL20.glBindAttribLocation(shaderProgramID, 0, "normal");
GL20.glBindAttribLocation(shaderProgramID, 1, "position");
但当我运行这两个代码时

GL20.glGetAttribLocation(programID, "position");
返回0而不是1


有没有办法清除以前绑定的位置,以便我可以绑定新的位置?

绑定属性位置后,必须重新链接程序。这在
glBindAttribLocation(…)
的文档中概述如下:

名称 -将通用顶点属性索引与命名属性变量相关联

C规格 无效GLBINDATTRIBLATION(GLuint程序, 胶合指数, 常量GLchar*名称)

描述 [……]

通过调用
glBindAttribLocation
,可以随时显式为程序对象的通用属性索引绑定指定属性变量名在调用
glLinkProgram
之前,属性绑定不会生效。
成功链接程序对象后,通用属性的索引值保持不变(并且可以查询它们的值),直到下一个链接命令出现

链接程序对象后发生的任何属性绑定在下次链接程序对象之前都不会生效。


谢谢你的回答,一切正常。唯一的问题是,每次运行glLinkProgram时,我的统一变量都会被清除。重置属性位置时是否有办法保留它们?@user37001:规范未定义该行为。我会说不。您的制服的值可能保持不变,也可能会发生变化,无法控制程序中的数据在重新链接后会发生什么变化。作为一般规则,无论如何,您不应该频繁更改属性绑定位置-您最好重构一些代码,以避免这样做。我希望尽可能快,所以我会想出其他方法来实现这一点。无论如何,谢谢你的回答。把你的制服放在一个由缓冲区对象支持的统一块中。然后,它们与程序分开存在(并且可以由多个程序共享),当您重新链接程序时,您只需再次调用glUniformBlockBinding。