0

有没有办法覆盖或清除 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

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

4

1 回答 1

2

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

姓名

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

C 规格

void glBindAttribLocation(GLuint 程序,GLuint 索引,const GLchar *name);

描述

[...]

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

在程序对象被链接之后发生的任何属性绑定直到下次程序对象被链接时才会生效。

于 2015-08-29T12:45:06.657 回答