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

时间:2015-08-29 11:02:29

标签: 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(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

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

1 个答案:

答案 0 :(得分:2)

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

  

名称

     
    

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

         

C规范

         
      

void glBindAttribLocation(GLuint程序,           GLuint指数,           const GLchar * name);

    
         

描述

         
      

[...]

             

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

             

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