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");

1 ではなく 0 を返します

新しい場所をバインドできるように、以前にバインドされた場所をクリアする方法はありますか?

4

1 に答える 1

2

属性の場所をバインドした後、プログラムを再リンクする必要があります。これは、次のようにドキュメントで概説されてglBindAttribLocation (...)います。

名前

glBindAttribLocation — 一般的な頂点属性インデックスを名前付き属性変数に

C仕様

void glBindAttribLocation(GLuint プログラム、GLuint インデックス、const GLchar *name);

説明

[...]

プログラム オブジェクトの属性変数名からジェネリック属性インデックスへのバインディングは、 を呼び出すことによっていつでも明示的に割り当てることができますglBindAttribLocationが呼び出されるまで、属性バインディングは有効になりません。glLinkProgramプログラム オブジェクトが正常にリンクされた後、ジェネリック属性のインデックス値は、次のリンク コマンドが発生するまで固定されたままになります (そして、それらの値を照会できます)。

プログラム オブジェクトがリンクされた後に発生する属性バインディングは、次にプログラム オブジェクトがリンクされるまで有効になりません。

于 2015-08-29T12:45:06.657 に答える